过滤器

一.解决全站编码

思路:1)若为get:创建自己的request类实现HttpServletRequestWrapper接口,重写其中getParameter()方法,将自己的自己的request传出去.

    (!其实这一步在tmcat8以后就不用了!!!因为默认utf-8编码,所以只解决post即可.        

    2)若为post:req.setCharacterEncoding("UTF-8");

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		//!!!将ServletRequest转为HttpServletRequest
		HttpServletRequest req=(HttpServletRequest)request;
		//判断请求方式
		if(req.getMethod().equals("GET")) {
			System.out.println("fggg");
			HttpServletRequestWrapper rw=new HttpServletRequestWrapper(req) {

				@Override
				public String getParameter(String name) {
					
					String s=request.getParameter(name);
					try {
						s=new String(s.getBytes("ISO-8859-1"),"UTF-8");
					} catch (UnsupportedEncodingException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					return s;
				};
			};
			
			chain.doFilter(rw, response);
			return ;
			
		}else if(req.getMethod().equals("POST")) {
			System.out.println("fpp");

			req.setCharacterEncoding("UTF-8");
			chain.doFilter(req, response);
		}
		
	}

二.粗粒度访问

思路:1)登录时在session中存用户信息.

        2)将权限不同的页面放在不同的包中.为每种权限设置一个过滤器过滤.

        3)过滤器中取出session,判断用户信息是否可以通过.若通过则放行,不通过转发到其他页面并显示提示信息

    例子:普通用户的filter

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		
		HttpServletRequest req=(HttpServletRequest)request;
		String user=(String) req.getSession().getAttribute("user");
		if(user!=null) {
			chain.doFilter(request, response);
			return ;
		}
		String admin=(String) req.getSession().getAttribute("admin");
		if(admin!=null) {
			chain.doFilter(request, response);
			return;
		}
		String msg="请先登录!";
		req.setAttribute("msg", msg);
		req.getRequestDispatcher("/all/login.jsp").forward(req, response);
		
	}
 <filter>
    <filter-name>user</filter-name>
    <filter-class>filter.userFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>user</filter-name>
    <url-pattern>/user/*</url-pattern>

三.四种拦截方式

REQUEST:

直接访问目标资源时执行过滤器。包括:在地址栏中直接访问、表单提交、超链接、重定向,只要在地址栏中可以看到目标资源的路径,就是REQUEST;

FORWARD:

转发访问执行过滤器。包括RequestDispatcher#forward()方法,<jsp:forward>标签都是转发访问;

INCLUDE

包含访问执行过滤器。包括RequestDispatcher#include()方法,<jsp:include>标签都是包含访问;

ERROR

当目标资源在web.xml中配置为<error-page>中时,并且真的出现了异常,转发到目标资源时,会执行过滤器。

配置:(可配置多个)
  1. <dispatcher>REQUEST</dispatcher>  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值