Filter——拦截请求保护页面安全 由David发表在天码营
在处理创建文章表单的Servlet中,创建了一个Post
对象,它的成员变量User
被设置为当前Session中的user
属性。从业务逻辑的角度来说,那么在创建文章时必须保证当前用户已经登录,对于没有登录的用户,不应该让它看到创建文章的表单页面。
为了实现这样的需求,我们可以直接在Servlet中编写类似逻辑:
User user = (User) req.getSession().getAttribute("user");
if (user == null) {
resp.sendError(HttpServletResponse.SC_FORBIDDEN, "no user in session");
}
SC_FORBIDDEN
是HttpServletResponse
中定义的一个常量,它的值是403
,这里的sendError
函数相当于向浏览器返回一个403 Forbidden
的状态码以及权限错误信息。
这一类需求在Web应用中非常的常见,尤其是多用户系统中用户身份的认证以及权限控制愈发重要。例如用户A不能访问用户B的文章管理页面并篡改B的文章。当我们的Web应用页面越来越多,需要类似权限控制的逻辑愈发复杂时,如果还在每一个Servlet中去编写这样的逻辑,不仅会出现大量重复的代码(可能很多页面的控制逻辑是相同的——例如用户已经登录才能访问),而且也违背了软件设计模式中的单一职责原则,Servlet既需要考虑处理HTTP请求,同时还需要考虑权限控制。