过滤器

过滤器

借鉴:

https://www.cnblogs.com/ygj0930/p/6374212.html

https://mp.weixin.qq.com/s?__biz=MzI4Njg5MDA5NA==&mid=2247483718&idx=3&sn=d63a56a3bdafa2df90178503e4d16d9d&chksm=ebd74047dca0c951eb72b5eb85553e513bd005318ee8c6ff9777d382581f0b352b2acdecf6fe#rd(Java3y)

Filter高级应用
https://mp.weixin.qq.com/s?__biz=MzI4Njg5MDA5NA==&mid=2247483718&idx=3&sn=d63a56a3bdafa2df90178503e4d16d9d&chksm=ebd74047dca0c951eb72b5eb85553e513bd005318ee8c6ff9777d382581f0b352b2acdecf6fe#rd

实质:

实现Filter接口的Java类
API:
init() //启动服务器时执行
doFilter(ServletRequest ,ServletResponse , FilterChain)//当可以拦截的请求到达时,新建一个线程去执行。同Servlet一样,
destory()//关闭服务器时执行

public class FilterDemo1 implements Filter {
        public void destroy() {
        }
    
        public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
            
            //拦截时执行语句

            //执行这一句,说明放行(让下一个过滤器执行,如果没有过滤器了,就执行执行目标资源)
            chain.doFilter(req, resp);

            //从后一个过滤器返回,或从目标资源返回时,执行语句。
        }
    
        public void init(FilterConfig config) throws ServletException {
            
        }
    }

功能:

filter

  1. 拦截访问Servlet的请求,在执行Servlet前执行自定义代码
  2. 通过chain.doFilter(req, resp);的有无决定是否放行,放行的话会执行到过滤器链下一个过滤器,如果还有的话;如果没有则会执行请求的目标Servlet
  3. 在Servlet执行后,返回到Filter时,执行一些自定义代码

实现方法:

  1. 新建Filter类,实现doFilter方法
  2. 部署,即配置Filter所拦截的url、参数等等
    实现方式一、在web.xml中配置
//filter用于注册过滤器

<filter>
    <filter-name>FilterDemo1</filter-name>
    <filter-class>FilterDemo1</filter-class>
    <init-param>
    <param-name>word_file</param-name> 
    <param-value>/WEB-INF/word.txt</param-value>
    </init-param>
</filter>


//<filter-mapping>元素用于设置一个Filter 所负责拦截的资源
//一个Filter拦截的资源可通过两种方式来指定:Servlet 名称和资源访问的请求路径

 <filter-mapping>
        <filter-name>FilterDemo1</filter-name>
        <url-pattern>/*</url-pattern>
</filter-mapping>

实现方式二、在Filter类上直接写注解

@WebFilter(filterName = "FilterDemo1",urlPatterns = "/*")

使用场景

  1. 编码问题,解决中文乱码
    在Filter类,添加注解,指明urlpatterns或value(2者不可同时使用)
    Filter类doFilter方法
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		
		HttpServletRequest req = (HttpServletRequest)request;
		HttpServletResponse res = (HttpServletResponse)response;
		
	
		req.setCharacterEncoding("utf-8");
		res.setCharacterEncoding("utf-8");
		res.setHeader("Content-type", "text/html;charset=utf-8");
		
		chain.doFilter(req, res);
		
		
	}
  1. 过滤敏感词汇(用户输入的敏感词汇)
  2. 对所有输出进行压缩(包括文本流和字节流的)
  3. 权限验证(登录权限、资源访问权限…)

  • 自动登录
    在登录过后,重新访问登录页面时,使用过滤器判断后跳转到,显示信息的页面。
    在浏览器关闭后,利用cookie使得在一定时间之内,仍然可以自动登录
    在这里插入图片描述
    github
    过滤器类:AutoLoginFilter.java
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		
		//常用的3个参数强制转换 ServletRequest->HttpServletReques
		HttpServletRequest req = (HttpServletRequest)request;
		//因为后边 进行了请求转发,所以此处不能获取response
		//HttpServletResponse res = (HttpServletResponse)response;
		HttpSession session = req.getSession();
		
		
		//当前用户此时已经在浏览器登录,此时正在使用浏览器。
		//由session的属性值(可以是<str,str>,<str,User>),判断是否登录了
		String uname1 = (String)session.getAttribute("uname");
		if(uname1!=null){
			request.setAttribute("msg", uname1+",登录成功");
			//注意在doFilter之前,可以使用请求转发
			request.getRequestDispatcher("message.jsp").forward(request, response);
			chain.doFilter(request, response);
			return;
		}
		
		
		
		//浏览器关闭一段时间后重开浏览器,访问登录页面。遍历cookie,取出用户名密码,检查。
		Cookie[] cookies = req.getCookies();
		if(cookies != null) {
			for(Cookie cookie: cookies) {
				if(cookie.getName() == "autolog") {
					String[] str = cookie.getValue().split("&");
					String uname = str[0].split("=")[1];
					String upsw = str[1].split("=")[1];
					if(uname.equals("aaa")&&upsw.equals("123")) {
						request.setAttribute("msg", uname1+",登录成功");
						request.getRequestDispatcher("message.jsp").forward(request, response);
						chain.doFilter(request, response);
						return;
					}
					
				}
			}
		}
		chain.doFilter(request, response);
	}

登录页面login.jsp

<form action="LoginServlet">
		<input type="text" name="uname"  />用户名
		<input type="password" name="upsw"  />密码
		<input type="submit" value="登录"  />
</form>

控制器LoginServlet.java

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	
		//LoginServlet中只用写,正常从login.jsp过来的请求即可。不需要判断是否登录过,这些由Filter处理。
		String uname = request.getParameter("uname");
		String upsw = request.getParameter("upsw");
		if(uname.equals("aaa")&&upsw.equals("123")) {
			//设置session属性,标记已登录
			request.getSession().setAttribute("uname", uname);
			//增加cookie,关闭浏览器后也能自动登录
			Cookie cookie = new Cookie("autolog","uname="+uname+"&"+"upsw="+upsw);
			cookie.setMaxAge(3*60);
			response.addCookie(cookie);
//System.out.println(uname+",登录成功");
			request.setAttribute("msg", uname+",登录成功");
		}else {
//System.out.println("登录失败");
			request.setAttribute("msg", "登录失败");
		}
		request.getRequestDispatcher("message.jsp").forward(request, response);
		
	}

显示信息页面message.jsp

<%=request.getAttribute("msg")%>
  1. 禁止浏览器缓存数据
  2. 在服务器端内存中缓存客户端经常访问的数据(提高访问速度,不用每次都去硬盘读)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于微信小程序的家政服务预约系统采用PHP语言和微信小程序技术,数据库采用Mysql,运行软件为微信开发者工具。本系统实现了管理员和客户、员工三个角色的功能。管理员的功能为客户管理、员工管理、家政服务管理、服务预约管理、员工风采管理、客户需求管理、接单管理等。客户的功能为查看家政服务进行预约和发布自己的需求以及管理预约信息和接单信息等。员工可以查看预约信息和进行接单。本系统实现了网上预约家政服务的流程化管理,可以帮助工作人员的管理工作和帮助客户查询家政服务的相关信息,改变了客户找家政服务的方式,提高了预约家政服务的效率。 本系统是针对网上预约家政服务开发的工作管理系统,包括到所有的工作内容。可以使网上预约家政服务的工作合理化和流程化。本系统包括手机端设计和电脑端设计,有界面和数据库。本系统的使用角色分为管理员和客户、员工三个身份。管理员可以管理系统里的所有信息。员工可以发布服务信息和查询客户的需求进行接单。客户可以发布需求和预约家政服务以及管理预约信息、接单信息。 本功能可以实现家政服务信息的查询和删除,管理员添加家政服务信息功能填写正确的信息就可以实现家政服务信息的添加,点击家政服务信息管理功能可以看到基于微信小程序的家政服务预约系统里所有家政服务的信息,在添加家政服务信息的界面里需要填写标题信息,当信息填写不正确就会造成家政服务信息添加失败。员工风采信息可以使客户更好的了解员工。员工风采信息管理的流程为,管理员点击员工风采信息管理功能,查看员工风采信息,点击员工风采信息添加功能,输入员工风采信息然后点击提交按钮就可以完成员工风采信息的添加。客户需求信息关系着客户的家政服务预约,管理员可以查询和修改客户需求信息,还可以查看客户需求的添加时间。接单信息属于本系统里的核心数据,管理员可以对接单的信息进行查询。本功能设计的目的可以使家政服务进行及时的安排。管理员可以查询员工信息,可以进行修改删除。 客户可以查看自己的预约和修改自己的资料并发布需求以及管理接单信息等。 在首页里可以看到管理员添加和管理的信息,客户可以在首页里进行家政服务的预约和公司介绍信息的了解。 员工可以查询客户需求进行接单以及管理家政服务信息和留言信息、收藏信息等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值