java web开发技术1——过滤器
2017-07-06 12:13 核桃不是桃 阅读(219) 评论(0) 收藏 举报过滤器包括:过滤源、过滤规则及过滤结果。
web过滤器的过滤源是指用户请求,过滤器本身并不会处理请求,只是进行一些辅助的操作。
例如检测用户是否登录。
再比如将404等错误界面进行处理之后展示给用户。
过滤器的定义:过滤器是一个服务器端的组件,他可以截取用户端的请求与响应信息,并对这些信息进行过滤
工作原理
过滤器在web程序启动时,从web容器中加载。用户发送请求时,进入过滤器判断之后发送给web资源(服务器)。web资源响应发送给过滤器,之后在通过处理发送给用户。
生命周期
过滤器的生命周期分四种,分别是:
- 实例化:通过在web.xml中配置,在web容器加载时实例化一次,
- 初始化:实例化完成后,调用过滤器的init方法,进行一些初始化操作,
- 过滤:doFilter方法,执行N次,每次捕获请求时都会执行此方法。
- 销毁:destroy方法,在web容器关闭时调用销毁方法。
过滤器的分类
- REQUEST:用户直接访问页面时,web容器将会调用
- FORWARD:目标资源是通过RequestDispatcher的forward访问时,该过滤器将被调用
- INCLUDE:目标资源是通过RequestDispatcher的include方法调用时,该过滤器将被调用
- ERROR:目标资源是通过声明式异常处理机制调用时,过滤器将被调用
登录认证实战案例
过滤器在实际项目中的应用场景
- 对用户请求进行统一认证
- 编码转发
- 对用户发送的数据进行过滤替换
- 转换图像格式
- 对响应的内容进行压缩
登录验证案例
需求是这样的,用户在登陆页面登陆正确跳转到成功页面,否则跳转到失败页面。但是当用户未登录时访问成功页面url会跳转到登录页面。
首先创建一个serlvet,验证当用户输入用户名和密码都是admin登陆成功,否则登录失败。代码如下:
package com.demo.serlvet; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.io.IOException; /** * Created by 24102 on 2017/7/6. */ public class LoginServlet extends HttpServlet { @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String username = req.getParameter("username"); String password = req.getParameter("password"); if ("admin".equals(username) && "admin".equals(password)){ //校验成功 HttpSession session = req.getSession(); session.setAttribute("username",username); resp.sendRedirect( req.getContextPath() + "/success.jsp"); }else{ //校验失败 resp.sendRedirect( req.getContextPath() + "/fail.jsp"); } } }
在web.xml中进行相应的配置:
<servlet> <servlet-name>loginServlet</servlet-name> <servlet-class>com.demo.serlvet.LoginServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>loginServlet</servlet-name> <url-pattern>/servlet/LoginServlet</url-pattern> </servlet-mapping>
登录页面login.jsp是一个简单的登陆表单,包括用户名和密码
<form action="<%=request.getContextPath() %>/servlet/LoginServlet" method="post"> 用户名:<input type="text" name="username"> 密码:<input type="password" name="password"> <input type="submit" value="提交"> </form>
以上代码就能实现根据用户名和密码是否正确跳转到相应的页面,还需要success.jsp和fail.jsp这两个文件,只需要在页面中添加相应的简单的标识文字。
要实现判断用户未登录时访问success.jsp跳转到登陆界面,需要用到过滤器。
创建过滤器LoginServlet:
package com.demo.serlvet; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.io.IOException; /** * Created by 24102 on 2017/7/6. */ public class LoginServlet extends HttpServlet { @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String username = req.getParameter("username"); String password = req.getParameter("password"); if ("admin".equals(username) && "admin".equals(password)){ //校验成功 HttpSession session = req.getSession(); session.setAttribute("username",username); resp.sendRedirect( req.getContextPath() + "/success.jsp"); }else{ //校验失败 resp.sendRedirect( req.getContextPath() + "/fail.jsp"); } } }
然后需要在web.xml中添加相应的配置:
<filter> <filter-name>loginFilter</filter-name> <filter-class>com.demo.filter.LoginFilter</filter-class> </filter> <filter-mapping> <filter-name>loginFilter</filter-name> <url-pattern>/success.jsp</url-pattern> </filter-mapping>
再次测试就发现实现需求了。还是很简单的。
浙公网安备 33010602011771号