JavaWeb_Filter小结(2)
Filter小结(2)
- 1.使用Filter实现简单的权限操作
1)MVC设计实现权限管理:
> 页面完全使用 JSTL 和 EL 。
> Servlet 受理请求,调用方法,转发或重定向页面。
> 面向对象的基本逻辑:Authority,User分别封装了权限和User信息。
2)equals() 方法的使用:List中是否含有指定的元素使用的是equals()方法进行比较。
// - 再获取用户所具有的权限的信息: List<Authority>
List<Authority> authorities = user.getAuthorities();
// - 检验用户是否有请求 servletPath 的权限: 可以思考除了遍历以外, 有没有更好的实现方式
Authority authority = new Authority(null, servletPath);
// - 若有权限则: 响应
if (authorities.contains(authority)) {
filterChain.doFilter(request, response);
return;
}
- 2.HttpServletRequestWrapper
1)why:需要改变从 Servlet 容器(可能是任何的 Servlet 容器)中传入的 HttpServletRequest 对象的某个行为,该怎么办?
①继承 HttpServletRequest 接口的 Servlet 容器的实现类,但就和具体的容器相耦合了。
②提供 HttpServletRequest 接口的实现类,很麻烦,而且也需要和具体的榕溪相耦合。
③使用装饰器设计模式:
> 提供一个类,该类实现 HttpServletRequest 接口
> 传入具体的一个容器实现的 HttpServletRequest 接口的实现类作为上述类的一个成员变量。
> 使用 HttpServletRequest 成员变量来实现 HttpServletRequest 接口的所有方法。
public class ServletRequestWrapper implements ServletRequest {
//被包装的那个 ServletRequest 对象
private ServletRequest request;
//构造器传入 ServletRequest 实现类对象
public ServletRequestWrapper(ServletRequest request) {
if (request == null) {
throw new IllegalArgumentException("Request cannot be null");
}
this.request = request;
}
//具体实现 ServletRequest 的方法: 调用被包装的那个成员变量的方法实现。
public Object getAttribute(String name) {
return this.request.getAttribute(name);
}
public Enumeration getAttributeNames() {
return this.request.getAttributeNames();
}
//...
}
.
> 在提供上述类的实现类,重写具体的方法即可。
public class MyHttpServletRequest extends HttpServletRequestWrapper{
public MyHttpServletRequest(HttpServletRequest request) {
super(request);
}
@Override
public String getParameter(String name) {
String val = super.getParameter(name);
if(val != null && val.contains(" fuck ")){
val = val.replace("fuck", "****");
}
return val;
}
}