javaweb中的过滤器
servlet过滤器工作原理
servlet过滤器工作原理
Servlet过滤器是Java Web应用程序中的一个组件,主要用于在请求到达Servlet之前或响应离开Servlet之前对请求或响应进行预
处理和后处理。
其工作原理可以分为以下几个步骤:
1. 过滤器包含了一个或多个过滤器链,每个过滤器链由多个过
滤器组成。
当一个请求到达Servlet容器时,容器会首先检查是否有
过滤器链与其对应。
2. 如果存在对应的过滤器链,则依次对请求进行预处理,如对
请求参数进行验证、对请求进行日志记录等操作。
3. 然后,过滤器链将处理后的请求传递给被过滤的Servlet,Servlet对请求进行处理并产生响应。
4. 当Servlet容器收到响应并准备发送到客户端时,它会遍历
响应所经过的过滤器链,依次对响应进行后处理,如对响应进行压缩、对响应进行加密等操作。
5. 最后,Servlet容器将处理后的响应发送到客户端。
总的来说,Servlet过滤器的作用是增强Java Web应用程序的安全性、可靠性和性能。
通过对请求和响应进行预处理和后处理,可以
有效地防范潜在的安全威胁,优化应用的性能,提高用户体验。
JAVAWEB面试题(含答案)
1、jsp和servlet的区别、共同点、各自应用的范围??JSP是Servlet技术的扩展,本质上就是Servlet的简易方式。
JSP编译后是“类servlet”。
Servlet和JSP最主要的不同点在于,Servlet的应用逻辑是在Java文件中,并且完全从表示层中的HTML里分离开来。
而JSP的情况是Java和HTML可以组合成一个扩展名为.jsp的文件。
JSP侧重于视图,Servlet主要用于控制逻辑。
在struts框架中,JSP位于MVC设计模式的视图层,而Servlet位于控制层.2、cookie和session的作用、区别、应用范围,session的工作原理Cookie:主要用在保存客户端,其值在客户端与服务端之间传送,不安全,存储的数据量有限。
Session:保存在服务端,每一个session在服务端有一个sessionID作一个标识。
存储的数据量大,安全性高。
占用服务端的内存资源。
3、jstl是什么?优点有哪些??JSTL(JSP Standard Tag Library,JSP标准标签库)是一个不断完善的开放源代码的JSP标签库,由四个定制标记库(core、format、xml和sql)和一对通用标记库验证器(ScriptFreeTLV和PermittedTaglibsTLV)组成。
优点有:最大程序地提高了WEB应用在各应用服务器在应用程序服务器之间提供了一致的接口,最大程序地提高了1、在应用程序服务器之间提供了一致的接口,之间的移植。
2、简化了JSP和WEB应用程序的开发。
3、以一种统一的方式减少了JSP中的scriptlet代码数量,可以达到没有任何scriptlet 代码的程序。
在我们公司的项目中是不允许有任何的scriptlet代码出现在JSP中。
4、允许JSP设计工具与WEB应用程序开发的进一步集成。
相信不久就会有支持JSTL的IDE 开发工具出现。
4、j2ee的优越性主要表现在哪些方面?MVC模式a、J2EE基于JAVA技术,与平台无关b、J2EE拥有开放标准,许多大型公司实现了对该规范支持的应用服务器。
javaweb中监听器、过滤器、拦截器以及AOP的先后顺序和理解
javaweb中监听器、过滤器、拦截器以及AOP的先后顺序和理解java web三⼤器:过滤器、拦截器、监听器(spring框架)spring、springMVC与springBoot的关系详见:⼀、启动顺序监听器---》过滤器---》拦截器案例理解:接到上级命令,要求对电话进去监听,过滤出恐怖分⼦,然后,拦截他们的恐怖袭击⾏动。
配置位置:监听器、过滤器⼀般配置在web.xml中,拦截器⼀般配置在springmvc.xml配置⽂件中⼆、概念监听器:Servlet的监听器Listener,它是实现了javax.servlet.ServletContextListener接⼝的服务器端程序,它也是随web应⽤的启动⽽启动,只初始化⼀次,随web应⽤的停⽌⽽销毁。
主要作⽤是:做⼀些初始化的内容添加⼯作、设置⼀些基本的内容、⽐如⼀些参数或者是⼀些固定的对象等等Filter过滤器:过滤器拦截web访问url地址。
严格意义上讲,filter只是适⽤于web中,依赖于Servlet容器,利⽤Java的回调机制进⾏实现。
Filter过滤器:和框架⽆关,可以控制最初的http请求,但是更细⼀点的类和⽅法控制不了。
过滤器可以拦截到⽅法的请求和响应(ServletRequest request, ServletResponse response),并对请求响应做出像响应的过滤操作,⽐如设置字符编码,鉴权操作等⽐如:(不是login.do的地址请求,如果⽤户没有登陆都过滤掉),或者在传⼊servlet或者struts的action前统⼀设置字符集,或者去除掉⼀些⾮法字符。
主要为了减轻服务器负载,减少压⼒。
Interceptor拦截器:拦截器拦截以 .action结尾的url,拦截Action的访问。
Interfactor是基于Java的反射机制(APO思想)进⾏实现,不依赖Servlet容器。
拦截器可以在⽅法执⾏之前(preHandle)和⽅法执⾏之后(afterCompletion)进⾏操作,回调操作(postHandle),可以获取执⾏的⽅法的名称,请求(HttpServletRequest)Interceptor:可以控制请求的控制器和⽅法,但控制不了请求⽅法⾥的参数(只能获取参数的名称,不能获取到参数的值)(⽤于处理页⾯提交的请求响应并进⾏处理,例如做国际化,做主题更换,过滤等)。
Java面试题之《过滤器与拦截器的区别》
Java⾯试题之《过滤器与拦截器的区别》过滤器与拦截器的区别过滤器,是在java web中,你传⼊的request,response提前过滤掉⼀些信息,或者提前设置⼀些参数,然后再传⼊servlet或者struts的 action 进⾏业务逻辑,⽐如过滤掉⾮法url(不是login.do的地址请求,如果⽤户没有登陆都过滤掉),或者在传⼊servlet或者 struts的action前统⼀设置字符集,或者去除掉⼀些⾮法字符拦截器,是在⾯向切⾯编程的就是在你的service或者⼀个⽅法,前调⽤⼀个⽅法,或者在⽅法后调⽤⼀个⽅法⽐如动态代理就是拦截器的简单实现,在你调⽤⽅法前打印出字符串(或者做其它业务逻辑的操作),也可以在你调⽤⽅法后打印出字符串,甚⾄在你抛出异常的时候做业务逻辑的操作。
拦截器与过滤器的区别:1. 拦截器是基于java的反射机制的,⽽过滤器是基于函数回调。
2. 拦截器不依赖与servlet容器,过滤器依赖与servlet容器。
3. 拦截器只能对action请求起作⽤,⽽过滤器则可以对⼏乎所有的请求起作⽤。
4. 拦截器可以访问action上下⽂、值栈⾥的对象,⽽过滤器不能访问。
5. 在action的⽣命周期中,拦截器可以多次被调⽤,⽽过滤器只能在容器初始化时被调⽤⼀次6. 拦截器可以获取IOC容器中的各个bean,⽽过滤器就不⾏,这点很重要,在拦截器⾥注⼊⼀个service,可以调⽤业务逻辑。
执⾏顺序:过滤前 - 拦截前 - Action处理 - 拦截后 - 过滤后。
个⼈认为过滤是⼀个横向的过程,⾸先把客户端提交的内容进⾏过滤(例如未登录⽤户不能访问内部页⾯的处理);过滤通过后,拦截器将检查⽤户提交数据的验证,做⼀些前期的数据处理,接着把处理后的数据发给对应的Action;Action处理完成返回后,拦截器还可以做其他过程(还没想到要做啥),再向上返回到过滤器的后续操作。
拦截器与过滤器使⽤场景:SpringMVC的处理器拦截器类似于Servlet开发中的过滤器Filter,⽤于对处理器进⾏预处理和后处理。
java使用过滤器实现登录拦截处理
java使⽤过滤器实现登录拦截处理⽬录滤器实现登录拦截处理⼀、什么是过滤器⼆、⼯作原理及⽣命周期三、过滤器使⽤filter简易实现登录功能拦截LoginFlitercontroller结果图滤器实现登录拦截处理⼀、什么是过滤器过滤器是处于客户端与服务器资源⽂件之间的⼀道过滤⽹(驻留在服务器端的Web组件),在访问资源⽂件之前,通过⼀系列的过滤器对请求进⾏修改、判断等,把不符合规则的请求在中途拦截或修改。
也可以对响应进⾏过滤,拦截或修改响应⼆、⼯作原理及⽣命周期举个例⼦当我们登录系统可以访问到页⾯,当退出登录后,要访问就必须重新登录,这就是过滤器起到的作⽤。
当我们访问某个接⼝时,过滤器会拦截请求,判断当前⽤户是否是登录状态,若登录则放⾏访问,若未登录则返回指定页⾯(通常为登录页或⼀个客户友好的提⽰页)这个过程包含了过滤器的⽣命周期:1.实例化2.初始化3.执⾏过滤操作(包括访问前对request操作和返回时对response的操作处理)4.销毁三、过滤器使⽤在springboot项⽬简单使⽤过滤器进⾏登录拦截处理1.实现过滤器public class MyFilter implements Filter {private static final String CURRENT_USER = "current_user";//配置⽩名单protected static List<Pattern> patterns = new ArrayList<Pattern>();//静态代码块,在虚拟机加载类的时候就会加载执⾏,⽽且只执⾏⼀次static {patterns.add(pile("/index"));patterns.add(pile("/login"));patterns.add(pile("/register"));}@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest httpRequest = (HttpServletRequest) servletRequest;HttpServletResponse httpResponse = (HttpServletResponse) servletResponse;HttpServletResponseWrapper wrapper = new HttpServletResponseWrapper(httpResponse);String url = httpRequest.getRequestURI().substring(httpRequest.getContextPath().length());if (isInclude(url)) {//在⽩名单中的url,放⾏访问filterChain.doFilter(httpRequest, httpResponse);return;}if (SessionUtils.getSessionAttribute(CURRENT_USER) != null) {//若为登录状态放⾏访问filterChain.doFilter(httpRequest, httpResponse);return;} else {//否则默认访问index接⼝wrapper.sendRedirect("/index");}}@Overridepublic void destroy() {}//判断当前请求是否在⽩名单private boolean isInclude(String url) {for (Pattern pattern : patterns) {Matcher matcher = pattern.matcher(url);if (matcher.matches()) {return true;}}return false;}}2.注册过滤器@Configurationpublic class WebConfig {/*** 配置过滤器* @return*/@Beanpublic FilterRegistrationBean someFilterRegistration() {FilterRegistrationBean registration = new FilterRegistrationBean();registration.setFilter(myFilter());//拦截/*的访问多级匹配(springboot 过滤器/*以及匹配 /**多级匹配)registration.addUrlPatterns("/*");registration.setName("myFilter");return registration;}/*** 创建⼀个bean* @return*/@Bean(name = "myFilter")public Filter myFilter() {return new MyFilter();}}3.运⾏项⽬访问/index,会发现没有被拦截,返回正确结果在未登录状态,访问/update接⼝,会被拦截跳转⾄/index页在登录状态,访问/update接⼝,可以访问这⾥也可以在程序debug看下。
java 中filter过滤器使用方法
Java 中filter 过滤器的使用:Servlets Filter 是Servlet 2.3 规范中新增加的,它是截取用户从客户端提交的请求,在还没有到达需要访问的资源时运行的一个类。
它操纵来自客户端的请求,在资源还没有初发送到客户端前截取响应,并处理这些还没有发送到客户端的响应。
Filters 有许多的应用场合。
Servlet 2.3 规范建议如下的地方可以应用Filter:authentication filterslogging and auditing filtersimage conversion filtersdata compression filtersencryption filterstokenizing filtersfilters that trigger resource access eventsXSL/T filters that transform XML contentMIME-type chain filters如何实现一个过滤器呢?1.所在的类实现Filter接口public interface Filterpublic void init(FilterConfig filterConfig)throws ServletException过滤器初始化是在容器启动时自动初始化public void doFilter(ServletRequest request,ServletResponse response,FilterChainchain)throws IOException,ServletExcepton在标准Servlet中的doGet或doPost 方法中,传递参数为:HttpServletRequest、HttpServletResponse过滤器销毁public void destroy()例:如下为过滤器基本的主要结构import java.io.IOException;import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;public class MyFirstFilter implements Filter{private String encoding;public void destroy(){System.out.println("过滤器销毁");}public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {System.out .println("过滤doFilter");chain.doFilter(request, response);}public void init(FilterConfig filterConfig) throws ServletException {System.out .println("过滤器初始化"); encoding = filterConfig.getInitParameter("encoding"}对应配置文件:<filter ><filter-name >encodingFilter </filter-name ><filter-class >com.shen.test.filter. MyFirstFilter </filter-class ><init-param ><param-name >encoding </param-name ><param-value >Shift_JIS </param-value ></init-param ></filter ><filter-mapping ><filter-name >encodingFilter </filter-name ><servlet-name >action </servlet-name ></filter-mapping ><servlet ><init-param ><<param-value >/WEB-INF/config/struts-config.xml,/WEB-INF/config/st ruts-config-contents.xml </param-value ></init-param ><init-param><param-name>debug</param-name><param-value>2</param-value></init-param><init-param><param-name>detail</param-name><param-value>2</param-value></init-param><load-on-startup>1</load-on-startup></servlet>如果过滤器要将内容传递到目的地,则需要FilterChain,将请求继续向下转发过滤器也会执行两次:FilterChain之前执行一次,之后再执行一次2:对某些文字进行过滤关键方法如下所示:public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {System.out.println("过滤doFilter");//从页面获取内容String content=request.getParameter("content");String filterchar ="色";if(content != null && !"".equals(content)){//如果indexOf返回-1则表示没有查到所要的内容if(-1 == content.indexOf(filterchar)){chain.doFilter(request, response);}else{System.out.println("有非法文字");//可以继续做处理//如果需要的话,此处依然可以使用RequestDispatcher进行跳转}}}3:设置统一编码/*** 对内容进行统一的编码*/request.setCharacterEncoding("GBK");response.setCharacterEncoding("GBK");4:登录验证:/*** 登陆验证*/public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {/*** 登陆验证*///Session属于http范畴,把以ServletRequest对象需要先转换成HttpServletRequest对象HttpServletRequest hrequest =(HttpServletRequest) request;HttpSession session =hrequest.getSession();//request.getScheme();request.getServerName();request.getServerPo rt();//如果session不为空,则可以浏览其它页面if(null != session.getAttribute("username")){chain.doFilter(request, response);}else{//通过requestDispatcher跳转到登陆面request.getRequestDispatcher("login.jsp").forward(request,respons e);}}第二部分:javax.servlet.Filter详细介绍:过滤器(Filter)位于客户端和web应用程序之间,用于检查和修改两者之间流过的请求和响应。
java过滤器的作用和工作原理
java过滤器的作⽤和⼯作原理对于⼀个web应⽤程序来说,过滤器是处于web容器内的⼀个组件,它会过滤特定请求资源请求信息和响应信息。
⼀个请求来到时,web容器会判断是否有过滤器与该信息资源相关联,如果有则交给过滤器处理,然后再交给⽬标资源,响应的时候则以相反的顺序交给过滤器处理,最后再返回给⽤户浏览器。
过滤器类需要实现javax.servlet.Filter,该接⼝的doFilter()⽅法是业务处理的核⼼代码区,类似于servlet的service()⽅法。
doFilter()⽅法的参数列表有⼀个FilterChain接⼝的实现对象,它只有⼀个⽅法doFilter(),在调⽤该⽅法之前的代码会在达到⽬标资源前执⾏,之后的代码会在⽬标资源已经响应后执⾏,例如:public class MyFilter implements Filter{//过滤器的逻辑业务⽅法public void doFilter(ServletRequest req,ServletResponse res,FilterChain chain)throws IOException,ServletException{//达到⽬标资源前的代码...//该⽅法的调⽤会将请求转发给下⼀个过滤器或⽬标资源chain.doFilter(req,res);//⽬标资源响应后的代码...}public void init(FilterConfig f)throws ServletException{}public void destroy(){}}web.xml配置:<filter><filter-name>MyFilter</filter-name><filter-class>MyFilter</filter-class>Filter完整类名</filter><filter-mapping><filter-name>MyFilter</filter-name><url-pattern>/*Servlet</url-pattern></filter-mapping>凡是请求以“Servlet”结尾的URL资源时,该过滤器都会起到过滤作⽤。
urlrewritefilter 用法
URL重写过滤器(URLRewriteFilter)是一个用于在Java Web应用程序中实现URL重写的过滤器。
它允许您在请求到达Servlet之前修改或重写URL。
使用URL重写过滤器可以为您的Web应用程序提供以下功能:URL重写:通过使用正则表达式和替换规则,您可以重写URL以实现更友好的URL结构、修改查询参数、添加特定标识符等。
URL映射:您可以映射多个URL路径到相同的Servlet,或者将不同的URL路径映射到不同的Servlet。
请求参数处理:您可以提取、修改或添加请求参数,以便在将请求传递给目标Servlet之前进行处理。
请求头处理:您可以添加、修改或删除请求头信息,以实现更高级的请求处理逻辑。
会话管理和重定向:您可以使用URL重写过滤器管理会话状态,并执行HTTP重定向。
要使用URL重写过滤器,您需要完成以下步骤:添加依赖项:将URL重写过滤器添加到您的项目中。
您可以通过下载JAR文件并将其添加到项目的类路径中,或者通过Maven或Gradle等构建工具添加依赖项。
配置过滤器:在您的Web应用程序的部署描述符(web.xml)中配置URL重写过滤器。
您需要指定过滤器的名称、过滤器映射和要执行的规则。
编写规则文件:根据您的需求编写规则文件,以指定要执行的重写规则和映射规则。
规则文件可以使用简单的正则表达式和映射规则来定义URL的重写逻辑。
配置Servlet:在您的Web应用程序中配置目标Servlet,以处理经过URL重写过滤器修改的请求。
测试和调试:测试和调试您的Web应用程序以确保URL重写过滤器按预期工作。
总之,URL重写过滤器是一个强大的工具,可用于在Java Web应用程序中实现URL重写、映射、参数处理和请求头处理等功能。
通过使用URL重写过滤器,您可以改善您的Web 应用程序的用户体验、可维护性和可扩展性。
java-过滤器Filter_多个Filter的执行顺序
java-过滤器Filter_多个Filter的执⾏顺序【Filter链】*在⼀个web应⽤中,可以开发编写多个Filter,这些Filter组合起来称为⼀个Filter链。
*web服务器根据Filter在web.xml中的注册顺序,决定先调⽤哪个Filter,当第⼀个Filter的doFilter⽅法被调⽤时,web服务器会创建⼀个代表Filter链的FilterChain对象传递给该⽅法,在doFilter⽅法中,开发⼈员如果调⽤了FilterChain对象的doFilter⽅法,则web服务器会检查FilterChain对象中是否还有filter,如果有,则调⽤第⼆个filter,如果没有,则调⽤⽬标资源。
【⼯程截图】设计了两个Filter和⼀个Servlet,访问Servlet时,查看Filter的执⾏顺序。
【web.xml】<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="/2001/XMLSchema-instance" xmlns="/xml/ns/javaee" xsi:schemaLocation="/xml/ns/javaee /xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" <display-name>FilterDemo01</display-name><welcome-file-list><welcome-file>index.jsp</welcome-file></welcome-file-list><!-- 过滤顺序:谁的写在上⾯,谁先被过滤 --><filter><filter-name>FilterTest01</filter-name><filter-class>com.Higgin.web.filter.FilterTest01</filter-class></filter><filter-mapping><filter-name>FilterTest01</filter-name><url-pattern>/*</url-pattern> <!-- 过滤所有 --></filter-mapping><filter><filter-name>FilterTest02</filter-name><filter-class>com.Higgin.web.filter.FilterTest02</filter-class></filter><filter-mapping><filter-name>FilterTest02</filter-name><url-pattern>/*</url-pattern> <!-- 过滤所有 --></filter-mapping></web-app>【FilterTest01.java】package com.Higgin.web.filter;import java.io.IOException;import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;public class FilterTest01 implements Filter{@Overridepublic void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {System.out.println("FilterTest01 执⾏前---");chain.doFilter(request, response);//让⽬标资源执⾏,即:放⾏System.out.println("FilterTest01 执⾏后---");}@Overridepublic void init(FilterConfig arg0) throws ServletException {}@Overridepublic void destroy() {}}【FilterTest02.java】package com.Higgin.web.filter;import java.io.IOException;import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;public class FilterTest02 implements Filter{@Overridepublic void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {System.out.println("FilterTest02 执⾏前---");chain.doFilter(request, response); //放⾏System.out.println("FilterTest02 执⾏后---");}@Overridepublic void init(FilterConfig arg0) throws ServletException {}@Overridepublic void destroy() {}}【ServletTest01.java】package com.Higgin.web.servlet;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;/*** Servlet implementation class ServletTest01*/@WebServlet("/ServletTest01")public class ServletTest01 extends HttpServlet {private static final long serialVersionUID = 1L;public ServletTest01() {super();}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //response.getWriter().write("中国加油!China Come on!");System.out.println("执⾏ServletTest01---");}protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request,response);}}【运⾏结果】在浏览器中输⼊:http://localhost:8080/FilterDemo01/ServletTest01查看控制台输出结果⾃⼰可以尝试分别注释FilterTest01和FilterTest02中的chain.doFilter⽅法,⽤Junit查看具体的执⾏过程。
Servlet工作原理
Servlet工作原理Servlet是Java编写的服务器端程序,用于处理客户端的请求并生成响应。
它是Java Servlet API的一部分,可以在支持Java的Web服务器上运行。
本文将详细介绍Servlet的工作原理。
1. Servlet容器Servlet容器是Web服务器或应用服务器中的一个组件,用于管理和执行Servlet。
它负责加载、初始化和销毁Servlet,以及处理客户端的请求和生成响应。
常见的Servlet容器有Tomcat、Jetty和WebLogic等。
2. Servlet生命周期Servlet的生命周期包括三个阶段:加载和初始化、请求处理和销毁。
2.1 加载和初始化当Servlet容器启动时,会加载并初始化配置的Servlet。
加载过程中,容器会查找并加载Servlet的类文件。
初始化过程中,容器会调用Servlet的init()方法,用于执行一些初始化操作,如读取配置文件、建立数据库连接等。
2.2 请求处理当客户端发送请求时,Servlet容器会创建一个Servlet实例来处理该请求。
容器会调用Servlet的service()方法,并将请求和响应对象作为参数传递给该方法。
在service()方法中,开发人员可以根据请求类型(GET、POST等)进行相应的处理逻辑,如读取请求参数、调用业务逻辑处理数据等。
2.3 销毁当Servlet容器关闭或重新加载Web应用程序时,会销毁所有已加载的Servlet 实例。
容器会调用Servlet的destroy()方法,开发人员可以在该方法中执行一些清理操作,如关闭数据库连接、释放资源等。
3. Servlet映射和URL匹配Servlet容器通过URL映射来确定哪个Servlet应该处理特定的请求。
URL映射可以通过web.xml配置文件或使用注解的方式进行定义。
例如,可以将特定URL 模式映射到某个Servlet,或将特定文件扩展名映射到某个Servlet。
filter过滤器原理
filter过滤器原理Filter过滤器是Java Servlet规范中的一个重要组成部分,它主要用于Web应用程序中对请求或响应进行一些处理或修改。
Filter过滤器能够拦截客户端请求和响应,并对其进行一些预处理或后处理,同时不对底层资源进行任何的改变。
在Web应用程序中,客户端的请求会按照一定的顺序被多个过滤器拦截,最后才会到达目标Servlet或JSP页面。
过滤器的拦截顺序是由web.xml文件中的顺序决定的,顺序越靠前的过滤器越先拦截请求。
Filter过滤器的工作过程可以用下面的流程来描述:1、当客户端发起请求时,服务器会根据客户端请求的URL找到相应的Servlet或JSP 页面。
2、在Servlet或JSP页面被执行之前,在过滤器链中的第一个过滤器会被调用。
这个过滤器可以实现一些真正的过滤操作,比如验证用户身份等。
3、当第一个过滤器完成处理后,请求会按照web.xml文件中定义的顺序,依次经过它后面的过滤器。
4、如果过滤器链中有多个过滤器,请求将根据它们的顺序进行处理。
当请求到达最后一个过滤器时,如果没有被任何一个过滤器拦截,则将请求传递给目标Servlet或JSP 页面。
5、在Servlet或JSP页面处理请求并生成响应后,响应会按照相反的顺序经过过滤器链中的过滤器进行处理或修改,最终响应到达客户端。
通过使用Filter过滤器,可以有效的将Web应用程序的功能模块拆分成多个独立的模块,这些模块可以按照一定的顺序调用,扩展或修改Web应用程序的行为。
具体的优点包括:1、实现模块可复用性:在一个应用程序中,多个模块可能会需要进行相同或相似的过滤操作,而使用Filter可以将这些操作独立出来,易于重复使用。
2、抽象控制流:通过使用Filter可以抽象出整个请求和响应的控制流,实现更细粒度的控制。
3、有效的处理URL:通过Filter可以有效的处理URL,实现URL的解析和路由处理。
4、可扩展性:在Web应用程序中,Filter可以很方便的进行增加、删除或修改,从而实现Web应用程序的功能扩展。
java中filter用法
在Java中,"filter" 一词通常与集合数据和Stream API相关联。
Java提供了一种称
为过滤器(Filter)的机制,它允许你通过指定条件来筛选集合中的元素。
在Java 中,过滤器通常与Lambda表达式和Stream API一起使用,以便更轻松地编写简洁、可读的代码。
以下是在Java中使用过滤器的一些常见场景和示例:
1. 使用 Stream 的filter方法:
假设有一个包含整数的列表,我们想要过滤出所有偶数:
2. 使用 Stream 的filter和map方法:
在这个例子中,我们筛选出长度大于3的字符串,并将它们转换为大写:
这里的filter方法用于筛选长度大于3的字符串,而map方法用于将它们转换为大写。
3. 使用Predicate自定义过滤条件:
有时候,我们可能想要定义一个自定义的过滤条件,这时可以使用Predicate接口:
这里的customFilter是一个自定义的Predicate,它筛选以字母 "a" 开头的字符串。
总体来说,Java中的过滤器主要使用Stream API中的filter方法,结合Lambda表达式来实现集合元素的条件筛选。
Web事件处理与过滤器
ServletContextAttributeEvent类是ServletContextEvent类 的子类,它除了继承了getServletContext()方法外,还定 义了下面两个方法: · public String getName()
– 返回发生改变的属性名。
· public Object getValue()
ServletRequest
ServletRequestListener
ServletRequestAttributeEvent
ServletRequestAttributeListene
11.1.2 监听Servlet上下文事件
在ServletContext对象上可能发生2种事件,对这些事件 可使用2个事件监听器处理。 表11.1 ServletContext事件类与监听器接口
• public void requestInitialized(ServletRequestEvent sce) • public void requestDestroyed(ServletRequestEvent sce)
ServletRequestEvent类定义了下面两个方法:
• public ServletContext getServletContext() • public ServletRequest getServletRequest()
JSP页面 访问JSP页面
12.1.4 监听会话事件
在HttpSession对象上可能发生2种事件,对这些事件可使 用4个事件监听器处理。 表11.3 HttpSession事件类与监听器接口
监听对象 事件 HttpSessionEvent HttpSession HttpSessionBindingEvent 监听器接口 HttpSessionListener HttpSessionActivationListen er HttpSessionAttributeListene r HttpSessionBindingListener
XSS过滤JAVA过滤器filter防止常见SQL注入
XSS过滤JAVA过滤器filter防⽌常见SQL注⼊Java项⽬中XSS过滤器的使⽤⽅法。
简单介绍:XSS : 跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS。
恶意攻击者往Web页⾯⾥插⼊恶意html代码,当⽤户浏览该页之时,嵌⼊其中Web⾥⾯的html代码会被执⾏,从⽽达到恶意攻击⽤户的特殊⽬的。
sql注⼊所谓SQL注⼊,就是通过把SQL命令插⼊到Web表单提交或输⼊域名或页⾯请求的查询字符串,最终达到欺骗服务器执⾏恶意的SQL命令。
具体来说,它是利⽤现有应⽤程序,将(恶意)的SQL命令注⼊到后台数据库引擎执⾏的能⼒,它可以通过在Web表单中输⼊(恶意)SQL 语句得到⼀个存在安全漏洞的⽹站上的数据库,⽽不是按照设计者意图去执⾏SQL语句。
实现⽅式,共三步:第⼀步:配置web.xml<filter><filter-name>xssFilter</filter-name><filter-class>com.wfcm.xss.XssFilter</filter-class></filter><filter-mapping><filter-name>xssFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>第⼆步:过滤⼯具类1.XSSFilter.javapackage com.wfcm.xss;import javax.servlet.*;import javax.servlet.http.HttpServletRequest;import java.io.IOException;/*** xss过滤* @author xlf* @email xlfbe696@* @date 2017年4⽉19⽇上午10:41:42*/public class XssFilter implements Filter {@Overridepublic void init(FilterConfig config) throws ServletException {}public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {XssHttpServletRequestWrapper xssRequest = new XssHttpServletRequestWrapper((HttpServletRequest) request);chain.doFilter(xssRequest, response);}@Overridepublic void destroy() {}}View Code2.XssHttpServletRequestWrapperpackage com.wfcm.xss;import ng.StringEscapeUtils;import ng.StringUtils;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletRequestWrapper;import java.util.LinkedHashMap;import java.util.Map;public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper { // 没被包装过的HttpServletRequest(特殊场景,需求⾃⼰过滤)HttpServletRequest orgRequest;// html过滤private final static HTMLFilter htmlFilter = new HTMLFilter();public XssHttpServletRequestWrapper(HttpServletRequest request) {super(request);orgRequest = request;}@Overridepublic String getParameter(String name) {String value = super.getParameter(xssEncode(name));if (StringUtils.isNotBlank(value)) {value =xssEncode(value);}//SQL注⼊检查// value = SQLFilter.sqlInject(value);value = SQLFilter.sqlInject(value);return StringEscapeUtils.unescapeHtml(value);}@Overridepublic String[] getParameterValues(String name) {String[] parameters = super.getParameterValues(name);if (parameters == null || parameters.length == 0) {return null;}for (int i = 0; i < parameters.length; i++) {parameters[i] = xssEncode(parameters[i]);//SQL注⼊检查// parameters[i] = SQLFilter.sqlInject(parameters[i]);parameters[i] = SQLFilter.sqlInject(parameters[i]);parameters[i] = StringEscapeUtils.unescapeHtml(parameters[i]);}return parameters;}@Overridepublic Map<String, String[]> getParameterMap() {Map<String, String[]> map = new LinkedHashMap<>();Map<String, String[]> parameters = super.getParameterMap();for (String key : parameters.keySet()) {String[] values = parameters.get(key);for (int i = 0; i < values.length; i++) {values[i] = xssEncode(values[i]);//SQL注⼊检查// values[i] = SQLFilter.sqlInject(values[i]);values[i] = SQLFilter.sqlInject(values[i]);values[i] = StringEscapeUtils.unescapeHtml(values[i]);}map.put(key, values);}return map;}@Overridepublic String getHeader(String name) {String value = super.getHeader(xssEncode(name));if (StringUtils.isNotBlank(value)) {value = xssEncode(value);}//SQL注⼊检查// value = SQLFilter.sqlInject(value);value = SQLFilter.sqlInject(value);return StringEscapeUtils.unescapeHtml(value);}private String xssEncode(String input) {return htmlFilter.filter(input);}/*** 获取最原始的request*/public HttpServletRequest getOrgRequest() {return orgRequest;}/*** 获取最原始的request*/public static HttpServletRequest getOrgRequest(HttpServletRequest request) {if (request instanceof XssHttpServletRequestWrapper) {return ((XssHttpServletRequestWrapper) request).getOrgRequest();}return request;}}View Code3.HTMLFilterpackage com.wfcm.xss;import java.util.ArrayList;import java.util.Collections;import java.util.HashMap;import java.util.List;import java.util.Map;import java.util.concurrent.ConcurrentHashMap;import java.util.concurrent.ConcurrentMap;import java.util.logging.Logger;import java.util.regex.Matcher;import java.util.regex.Pattern;/**** HTML filtering utility for protecting against XSS (Cross Site Scripting).** This code is licensed LGPLv3** This code is a Java port of the original work in PHP by Cal Hendersen.* /php/lib_filter/** The trickiest part of the translation was handling the differences in regex handling* between PHP and Java. These resources were helpful in the process:** /j2se/1.4.2/docs/api/java/util/regex/Pattern.html* /manual/en/reference.pcre.pattern.modifiers.php* /modifiers.html** A note on naming conventions: instance variables are prefixed with a "v"; global* constants are in all caps.** Sample use:* String input = ...* String clean = new HTMLFilter().filter( input );** The class is not thread safe. Create a new instance if in doubt.** If you find bugs or have suggestions on improvement (especially regarding* performance), please contact us. The latest version of this* source, and our contact details, can be found at ** @author Joseph O'Connell* @author Cal Hendersen* @author Michael Semb Wever*/public class HTMLFilter {/** regex flag union representing /si modifiers in php **/private static final int REGEX_FLAGS_SI = Pattern.CASE_INSENSITIVE | Pattern.DOTALL;private static final Pattern P_COMMENTS = pile("<!--(.*?)-->", Pattern.DOTALL);private static final Pattern P_COMMENT = pile("^!--(.*)--$", REGEX_FLAGS_SI);private static final Pattern P_TAGS = pile("<(.*?)>", Pattern.DOTALL);private static final Pattern P_END_TAG = pile("^/([a-z0-9]+)", REGEX_FLAGS_SI);private static final Pattern P_START_TAG = pile("^([a-z0-9]+)(.*?)(/?)$", REGEX_FLAGS_SI);private static final Pattern P_QUOTED_ATTRIBUTES = pile("([a-z0-9]+)=([\"'])(.*?)\\2", REGEX_FLAGS_SI); private static final Pattern P_UNQUOTED_ATTRIBUTES = pile("([a-z0-9]+)(=)([^\"\\s']+)", REGEX_FLAGS_SI); private static final Pattern P_PROTOCOL = pile("^([^:]+):", REGEX_FLAGS_SI);private static final Pattern P_ENTITY = pile("&#(\\d+);?");private static final Pattern P_ENTITY_UNICODE = pile("&#x([0-9a-f]+);?");private static final Pattern P_ENCODE = pile("%([0-9a-f]{2});?");private static final Pattern P_VALID_ENTITIES = pile("&([^&;]*)(?=(;|&|$))");private static final Pattern P_VALID_QUOTES = pile("(>|^)([^<]+?)(<|$)", Pattern.DOTALL);private static final Pattern P_END_ARROW = pile("^>");private static final Pattern P_BODY_TO_END = pile("<([^>]*?)(?=<|$)");private static final Pattern P_XML_CONTENT = pile("(^|>)([^<]*?)(?=>)");private static final Pattern P_STRAY_LEFT_ARROW = pile("<([^>]*?)(?=<|$)");private static final Pattern P_STRAY_RIGHT_ARROW = pile("(^|>)([^<]*?)(?=>)");private static final Pattern P_AMP = pile("&");private static final Pattern P_QUOTE = pile("\"");private static final Pattern P_LEFT_ARROW = pile("<");private static final Pattern P_RIGHT_ARROW = pile(">");private static final Pattern P_BOTH_ARROWS = pile("<>");private static final Pattern P_DOUBLE_QUOT = pile(""");// @xxx could grow large... maybe use sesat's ReferenceMapprivate static final ConcurrentMap<String,Pattern> P_REMOVE_PAIR_BLANKS = new ConcurrentHashMap<String, Pattern>(); private static final ConcurrentMap<String,Pattern> P_REMOVE_SELF_BLANKS = new ConcurrentHashMap<String, Pattern>(); /** set of allowed html elements, along with allowed attributes for each element **/private final Map<String, List<String>> vAllowed;/** counts of open tags for each (allowable) html element **/private final Map<String, Integer> vTagCounts = new HashMap<String, Integer>();/** html elements which must always be self-closing (e.g. "<img />") **/private final String[] vSelfClosingTags;/** html elements which must always have separate opening and closing tags (e.g. "<b></b>") **/private final String[] vNeedClosingTags;/** set of disallowed html elements **/private final String[] vDisallowed;/** attributes which should be checked for valid protocols **/private final String[] vProtocolAtts;/** allowed protocols **/private final String[] vAllowedProtocols;/** tags which should be removed if they contain no content (e.g. "<b></b>" or "<b />") **/private final String[] vRemoveBlanks;/** entities allowed within html markup **/private final String[] vAllowedEntities;/** flag determining whether comments are allowed in input String. */private final boolean stripComment;private final boolean encodeQuotes;private boolean vDebug = false;/*** flag determining whether to try to make tags when presented with "unbalanced"* angle brackets (e.g. "<b text </b>" becomes "<b> text </b>"). If set to false,* unbalanced angle brackets will be html escaped.*/private final boolean alwaysMakeTags;/** Default constructor.**/public HTMLFilter() {vAllowed = new HashMap<>();final ArrayList<String> a_atts = new ArrayList<String>();a_atts.add("href");a_atts.add("target");vAllowed.put("a", a_atts);final ArrayList<String> img_atts = new ArrayList<String>();img_atts.add("src");img_atts.add("width");img_atts.add("height");img_atts.add("alt");vAllowed.put("img", img_atts);final ArrayList<String> no_atts = new ArrayList<String>();vAllowed.put("b", no_atts);vAllowed.put("strong", no_atts);vAllowed.put("i", no_atts);vAllowed.put("em", no_atts);vSelfClosingTags = new String[]{"img"};vNeedClosingTags = new String[]{"a", "b", "strong", "i", "em"};vDisallowed = new String[]{};vAllowedProtocols = new String[]{"http", "mailto", "https"}; // no ftp.vProtocolAtts = new String[]{"src", "href"};vRemoveBlanks = new String[]{"a", "b", "strong", "i", "em"};vAllowedEntities = new String[]{"amp", "gt", "lt", "quot"};stripComment = true;encodeQuotes = true;alwaysMakeTags = true;}/** Set debug flag to true. Otherwise use default settings. See the default constructor.** @param debug turn debug on with a true argument*/public HTMLFilter(final boolean debug) {this();vDebug = debug;}/** Map-parameter configurable constructor.** @param conf map containing configuration. keys match field names.*/public HTMLFilter(final Map<String,Object> conf) {assert conf.containsKey("vAllowed") : "configuration requires vAllowed";assert conf.containsKey("vSelfClosingTags") : "configuration requires vSelfClosingTags";assert conf.containsKey("vNeedClosingTags") : "configuration requires vNeedClosingTags";assert conf.containsKey("vDisallowed") : "configuration requires vDisallowed";assert conf.containsKey("vAllowedProtocols") : "configuration requires vAllowedProtocols";assert conf.containsKey("vProtocolAtts") : "configuration requires vProtocolAtts";assert conf.containsKey("vRemoveBlanks") : "configuration requires vRemoveBlanks";assert conf.containsKey("vAllowedEntities") : "configuration requires vAllowedEntities";vAllowed = Collections.unmodifiableMap((HashMap<String, List<String>>) conf.get("vAllowed"));vSelfClosingTags = (String[]) conf.get("vSelfClosingTags");vNeedClosingTags = (String[]) conf.get("vNeedClosingTags");vDisallowed = (String[]) conf.get("vDisallowed");vAllowedProtocols = (String[]) conf.get("vAllowedProtocols");vProtocolAtts = (String[]) conf.get("vProtocolAtts");vRemoveBlanks = (String[]) conf.get("vRemoveBlanks");vAllowedEntities = (String[]) conf.get("vAllowedEntities");stripComment = conf.containsKey("stripComment") ? (Boolean) conf.get("stripComment") : true;encodeQuotes = conf.containsKey("encodeQuotes") ? (Boolean) conf.get("encodeQuotes") : true;alwaysMakeTags = conf.containsKey("alwaysMakeTags") ? (Boolean) conf.get("alwaysMakeTags") : true; }private void reset() {vTagCounts.clear();}private void debug(final String msg) {if (vDebug) {Logger.getAnonymousLogger().info(msg);}}//---------------------------------------------------------------// my versions of some PHP library functionspublic static String chr(final int decimal) {return String.valueOf((char) decimal);}public static String htmlSpecialChars(final String s) {String result = s;result = regexReplace(P_AMP, "&", result);result = regexReplace(P_QUOTE, """, result);result = regexReplace(P_LEFT_ARROW, "<", result);result = regexReplace(P_RIGHT_ARROW, ">", result);return result;}//---------------------------------------------------------------/*** given a user submitted input String, filter out any invalid or restricted* html.** @param input text (i.e. submitted by a user) than may contain html* @return "clean" version of input, with only valid, whitelisted html elements allowed*/public String filter(final String input) {reset();String s = input;debug("************************************************");debug(" INPUT: " + input);s = escapeComments(s);debug(" escapeComments: " + s);s = balanceHTML(s);debug(" balanceHTML: " + s);s = checkTags(s);debug(" checkTags: " + s);s = processRemoveBlanks(s);debug("processRemoveBlanks: " + s);s = validateEntities(s);debug(" validateEntites: " + s);debug("************************************************\n\n");return s;}public boolean isAlwaysMakeTags(){return alwaysMakeTags;}public boolean isStripComments(){return stripComment;}private String escapeComments(final String s) {final Matcher m = P_COMMENTS.matcher(s);final StringBuffer buf = new StringBuffer();if (m.find()) {final String match = m.group(1); //(.*?)m.appendReplacement(buf, Matcher.quoteReplacement("<!--" + htmlSpecialChars(match) + "-->")); }m.appendTail(buf);return buf.toString();}private String balanceHTML(String s) {if (alwaysMakeTags) {//// try and form html//s = regexReplace(P_END_ARROW, "", s);s = regexReplace(P_BODY_TO_END, "<$1>", s);s = regexReplace(P_XML_CONTENT, "$1<$2", s);} else {//// escape stray brackets//s = regexReplace(P_STRAY_LEFT_ARROW, "<$1", s);s = regexReplace(P_STRAY_RIGHT_ARROW, "$1$2><", s);//// the last regexp causes '<>' entities to appear// (we need to do a lookahead assertion so that the last bracket can// be used in the next pass of the regexp)//s = regexReplace(P_BOTH_ARROWS, "", s);}return s;}private String checkTags(String s) {Matcher m = P_TAGS.matcher(s);final StringBuffer buf = new StringBuffer();while (m.find()) {String replaceStr = m.group(1);replaceStr = processTag(replaceStr);m.appendReplacement(buf, Matcher.quoteReplacement(replaceStr));}m.appendTail(buf);s = buf.toString();// these get tallied in processTag// (remember to reset before subsequent calls to filter method)for (String key : vTagCounts.keySet()) {for (int ii = 0; ii < vTagCounts.get(key); ii++) {s += "</" + key + ">";}}return s;}private String processRemoveBlanks(final String s) {String result = s;for (String tag : vRemoveBlanks) {if(!P_REMOVE_PAIR_BLANKS.containsKey(tag)){P_REMOVE_PAIR_BLANKS.putIfAbsent(tag, pile("<" + tag + "(\\s[^>]*)?></" + tag + ">")); }result = regexReplace(P_REMOVE_PAIR_BLANKS.get(tag), "", result);if(!P_REMOVE_SELF_BLANKS.containsKey(tag)){P_REMOVE_SELF_BLANKS.putIfAbsent(tag, pile("<" + tag + "(\\s[^>]*)?/>"));}result = regexReplace(P_REMOVE_SELF_BLANKS.get(tag), "", result);}return result;}private static String regexReplace(final Pattern regex_pattern, final String replacement, final String s) {Matcher m = regex_pattern.matcher(s);return m.replaceAll(replacement);}private String processTag(final String s) {// ending tagsMatcher m = P_END_TAG.matcher(s);if (m.find()) {final String name = m.group(1).toLowerCase();if (allowed(name)) {if (!inArray(name, vSelfClosingTags)) {if (vTagCounts.containsKey(name)) {vTagCounts.put(name, vTagCounts.get(name) - 1);return "</" + name + ">";}}}}// starting tagsm = P_START_TAG.matcher(s);if (m.find()) {final String name = m.group(1).toLowerCase();final String body = m.group(2);String ending = m.group(3);//debug( "in a starting tag, name='" + name + "'; body='" + body + "'; ending='" + ending + "'" );if (allowed(name)) {String params = "";final Matcher m2 = P_QUOTED_ATTRIBUTES.matcher(body);final Matcher m3 = P_UNQUOTED_ATTRIBUTES.matcher(body);final List<String> paramNames = new ArrayList<String>();final List<String> paramValues = new ArrayList<String>();while (m2.find()) {paramNames.add(m2.group(1)); //([a-z0-9]+)paramValues.add(m2.group(3)); //(.*?)}while (m3.find()) {paramNames.add(m3.group(1)); //([a-z0-9]+)paramValues.add(m3.group(3)); //([^\"\\s']+)}String paramName, paramValue;for (int ii = 0; ii < paramNames.size(); ii++) {paramName = paramNames.get(ii).toLowerCase();paramValue = paramValues.get(ii);// debug( "paramName='" + paramName + "'" );// debug( "paramValue='" + paramValue + "'" );// debug( "allowed? " + vAllowed.get( name ).contains( paramName ) );if (allowedAttribute(name, paramName)) {if (inArray(paramName, vProtocolAtts)) {paramValue = processParamProtocol(paramValue);}params += " " + paramName + "=\"" + paramValue + "\"";}}if (inArray(name, vSelfClosingTags)) {ending = " /";}if (inArray(name, vNeedClosingTags)) {ending = "";}if (ending == null || ending.length() < 1) {if (vTagCounts.containsKey(name)) {vTagCounts.put(name, vTagCounts.get(name) + 1);} else {vTagCounts.put(name, 1);}} else {ending = " /";}return "<" + name + params + ending + ">";} else {return "";}}// commentsm = P_COMMENT.matcher(s);if (!stripComment && m.find()) {return "<" + m.group() + ">";}return "";}private String processParamProtocol(String s) {s = decodeEntities(s);final Matcher m = P_PROTOCOL.matcher(s);if (m.find()) {final String protocol = m.group(1);if (!inArray(protocol, vAllowedProtocols)) {// bad protocol, turn into local anchor link insteads = "#" + s.substring(protocol.length() + 1, s.length());if (s.startsWith("#//")) {s = "#" + s.substring(3, s.length());}}}return s;}private String decodeEntities(String s) {StringBuffer buf = new StringBuffer();Matcher m = P_ENTITY.matcher(s);while (m.find()) {final String match = m.group(1);final int decimal = Integer.decode(match).intValue();m.appendReplacement(buf, Matcher.quoteReplacement(chr(decimal))); }m.appendTail(buf);s = buf.toString();buf = new StringBuffer();m = P_ENTITY_UNICODE.matcher(s);while (m.find()) {final String match = m.group(1);final int decimal = Integer.valueOf(match, 16).intValue();m.appendReplacement(buf, Matcher.quoteReplacement(chr(decimal))); }m.appendTail(buf);s = buf.toString();buf = new StringBuffer();m = P_ENCODE.matcher(s);while (m.find()) {final String match = m.group(1);final int decimal = Integer.valueOf(match, 16).intValue();m.appendReplacement(buf, Matcher.quoteReplacement(chr(decimal))); }m.appendTail(buf);s = buf.toString();s = validateEntities(s);return s;}private String validateEntities(final String s) {StringBuffer buf = new StringBuffer();// validate entities throughout the stringMatcher m = P_VALID_ENTITIES.matcher(s);while (m.find()) {final String one = m.group(1); //([^&;]*)final String two = m.group(2); //(?=(;|&|$))m.appendReplacement(buf, Matcher.quoteReplacement(checkEntity(one, two)));}m.appendTail(buf);return encodeQuotes(buf.toString());}private String encodeQuotes(final String s){if(encodeQuotes){StringBuffer buf = new StringBuffer();Matcher m = P_VALID_QUOTES.matcher(s);while (m.find()) {final String one = m.group(1); //(>|^)final String two = m.group(2); //([^<]+?)final String three = m.group(3); //(<|$)m.appendReplacement(buf, Matcher.quoteReplacement(one + regexReplace(P_QUOTE, """, two) + three)); }m.appendTail(buf);return buf.toString();}else{return s;}}private String checkEntity(final String preamble, final String term) {return ";".equals(term) && isValidEntity(preamble)'&' + preamble: "&" + preamble;}private boolean isValidEntity(final String entity) {return inArray(entity, vAllowedEntities);}private static boolean inArray(final String s, final String[] array) {for (String item : array) {if (item != null && item.equals(s)) {return true;}}return false;}private boolean allowed(final String name) {return (vAllowed.isEmpty() || vAllowed.containsKey(name)) && !inArray(name, vDisallowed);}private boolean allowedAttribute(final String name, final String paramName) {return allowed(name) && (vAllowed.isEmpty() || vAllowed.get(name).contains(paramName));}}View Code4.SQLFilterpackage com.wfcm.xss;import ng.StringUtils;import com.wfcm.utils.RRException;/*** sql过滤** @author xlf* @email xlfbe696@* @date 2017年4⽉19⽇上午10:41:25*/public class SQLFilter {/*** SQL注⼊过滤** @param str* 待验证的字符串*/public static String sqlInject(String str) {if (StringUtils.isBlank(str)) {return null;}// 去掉'|"|;|\字符str = StringUtils.replace(str, "'", "");str = StringUtils.replace(str, "\"", "");str = StringUtils.replace(str, ";", "");str = StringUtils.replace(str, "\\", "");// 转换成⼩写str = str.toLowerCase();// ⾮法字符String[] keywords = { "master", "truncate", "insert", "select", "delete", "update", "declare", "alert", "create", "drop" };// 判断是否包含⾮法字符for (String keyword : keywords) {if (str.equals(keyword)) {throw new RRException("包含⾮法字符", 1);}}return str;}}View Code第三步:⼤功告成!!。
java过滤器的工作原理
java过滤器的工作原理
过滤器是Java Web应用程序中的组件,用于对请求和响应进行预处理和后处理。
它的工作原理如下:
1. 客户端发起请求到服务器,请求首先会经过过滤器。
2. 过滤器对请求进行拦截,并可以在请求到达目标资源之前进行预处理操作,如验证用户身份、检查请求参数等。
3. 过滤器可以修改请求的内容,比如添加、修改或删除请求头信息。
4. 过滤器将处理后的请求传递给下一个过滤器或目标资源。
5. 目标资源处理请求并生成响应。
6. 响应首先会经过与请求相反的过滤器链,过滤器可以在响应返回客户端之前进行后处理操作,如对响应内容进行压缩、加密等。
7. 过滤器可以修改响应的内容,比如修改响应头信息、添加新的响应内容等。
8. 经过所有的过滤器链后,响应将返回给客户端。
通过这个过程,过滤器可以对请求和响应进行拦截、加工和修改,实现对Web应用程序的统一处理和控制。
过滤器的工作
原理使得开发者可以在不修改目标资源的情况下,对请求和响应进行控制,提高代码的复用性和可维护性。
Java8过滤器(Filter)
Java8过滤器(Filter)1、在Java之前对List进⾏过滤的⽅式public class BeforeJava8 {public static void main(String[] args) {List<Person> peoples = Arrays.asList(new Person("java", 22),new Person("js", 35),new Person("css", 31));Person result = getStudentByName(peoples, "java");System.out.println(result);}private static Person getStudentByName(List<Person> peoples, String name) {Person result = null;for (Person person : peoples) {if (name.equals(person.getName())) {result = person;}}return result;}}2、在Java8使⽤Filter过滤Listpublic class FilterJava8 {public static void main(String[] args) {List<Person> peoples = Arrays.asList(new Person("java", 22),new Person("js", 35),new Person("css", 31));Person result1 = peoples.stream().filter(p -> "java".equals(p.getName())).findAny().orElse(null);System.out.println(result1);Person result2 = peoples.stream().filter(p -> "spring".equals(p.getName())).findAny().orElse(null);System.out.println(result2);Person result3 = peoples.stream().filter((p) -> "java".equals(p.getName()) && 22 == p.getAge()).findAny().orElse(null);System.out.println(result3);// 使⽤map收集String name = peoples.stream().filter(p -> "js".equals(p.getName())).map(Person::getName).findAny().orElse("");System.out.println(name);System.out.println("---------");List<String> names = peoples.stream().map(Person::getName).collect(Collectors.toList());names.forEach(System.out::println);}}。
第8章 Java web高级编程技术
2.Tomcat 中直接使用的方法: (1)数据源配置,代码如程序8-14所示. (2)异步获取连接的方法,代码如程序8-15 所示. (3)在独立的应用中使用,代码如程序8-16 所示.
小结
本章主要介绍了Java web中访问权限控制、 数据库连接池技术等高级编程技术,通过实现 登录访问控制过滤器案例,介绍了访问权限控 制过滤器的设计流程和Filter,通过实现字符 过滤器案例,介绍了字符过滤器的设计思路和 方法,通过实现连接池优化数据库连接案例, 介绍了数据库连接池原理及配置方法等。
1.基本概念及原理 2.服务器自带的连接池 连接池关键问题分析: 1.并发问题 2.多数据库服务器和多用户 3.事务处理 4.连接池的分配与释放 5.连接池的配置与维护
Tomcat DBCP Tomcat DBCP,英文全称为Tomcat DataBase Connection Pool,是Tomcat提 供的数据库连接池解决方案。在程序开发过程 中,采用JDBC直接连接数据库比较耗费资源 ,而手动编写连接池又比较麻烦,因此可以采 用一些服务器提供的连接池技术。
2. 编写过滤器类Encoding,在该类的 doFilter方法中,在使用FilterChain对象将 请求传递至下一个过滤器或调用目标资源前, 将原request对象进行装饰。代码如程序8-9 所示。
扩展—— Servlet 3.0新特性
Leabharlann 1. 异步处理支持 2. 新增的注解支持 3.可插性支持
新知识点——数据库连接池原理、Tomcat DBCP
数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的 网页应用程序中体现得尤为突出。对数据库连接的管理能显著影 响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标。 数据库连接池正是针对这个问题提出来的。数据库连接池负责分 配、管理和释放数据库连接,它允许应用程序重复使用一个现有 的数据库连接,而再不是重新建立一个;释放空闲时间超过最大 空闲时间的数据库连接来避免因为没有释放数据库连接而引起的 数据库连接遗漏。这项技术能明显提高对数据库操作的性能。
Filter(过滤器)简介和工作原理
Filter(过滤器)简介和工作原理Filter(过滤器)简介Filter 的基本功能是对 Servlet 容器调用 Servlet 的过程进行拦截,从而在Servlet 进行响应处理的前后实现一些特殊的功能。
在 Servlet API 中定义了三个接口类来开供开发人员编写 Filter 程序:Filter, FilterChain, FilterConfigFilter 程序是一个实现了 Filter 接口的 Java 类,与 Servlet 程序相似,它由 Servlet容器进行调用和执行Filter 程序需要在 web.xml 文件中进行注册和设置它所能拦截的资源:Filter 程序可以拦截Jsp, Servlet, 静态图片文件和静态 html 文件Filter 的基本工作原理当在 web.xml 中注册了一个 Filter 来对某个 Servlet 程序进行拦截处理时,这个 Filter 就成了 Servlet 容器与该 Servlet 程序的通信线路上的一道关卡,该 Filter 可以对 Servlet 容器发送给 Servlet 程序的请求和 Servlet 程序回送给 Servlet 容器的相应进行拦截,可以决定是否将请求继续传递给Servlet 程序,以及对请求和相应信息是否进行修改在一个 web 应用程序中可以注册多个 Filter 程序,每个 Filter 程序都可以对一个或一组 Servlet 程序进行拦截。
若有多个 Filter 程序对某个 Servlet 程序的访问过程进行拦截,当针对该Servlet 的访问请求到达时,web 容器将把这多个 Filter 程序组合成一个Filter 链(过滤器链)。
Filter 链中各个 Filter 的拦截顺序与它们在应用程序的 web.xml 中映射的顺序一致Filter 接口init(FilterConfig filterConfig)throws ServletException:在 web 应用程序启动时,web 服务器将根据 web.xml 文件中的配置信息来创建每个注册的Filter 实例对象,并将其保存在服务器的内存中。
详解JavaWeb中的过滤器Filter
详解JavaWeb中的过滤器Filter ⽬录⼀、什么是过滤器1.1使⽤步骤⼆、初体验2.1mynav.html2.2FilterServlet程序2.3HelloServlet程序2.4web.xml2.5index.jsp三、测试四、Filter的⽣命周期五、FilterConfig类六、FilterChain过滤器链七、Filter的拦截路径⼋、精确匹配8.1⽬录匹配8.2后缀名匹配⼀、什么是过滤器1.Filter过滤器的作⽤:拦截请求2.拦截请求常见场景:(1)权限检查(2)⽇记操作(3)事务管理1.1 使⽤步骤Filter 过滤器的使⽤步骤:1、编写⼀个类去实现Filter 接⼝2、实现过滤⽅法doFilter()3、到web.xml 中去配置Filter 的拦截路径⼆、初体验web⼯程下新建⼀个admin⽬录,作为需要权限才能访问的⽬录,其中有两个⽂件2.1 mynav.html<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>导航</title></head><body><table><tr><td>百度<input type="text"></td></tr><tr><td>Google<input type="text"></td></tr><tr><td>必应<input type="text"></td></tr></table></body></html>2.2 FilterServlet程序package com.filter.filter;import javax.servlet.*;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpSession;import java.io.IOException;/*** @author ningqian* @create -05-16 20:17*///注意导包是javaxpublic class FilterServlet implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { System.out.println("来到Filter过滤器");HttpServletRequest httpServletRequest = (HttpServletRequest)servletRequest;HttpSession session = httpServletRequest.getSession();//如果session的属性user为空,转发到⾸页if(session.getAttribute("user")==null){servletRequest.getRequestDispatcher("/index.jsp").forward(servletRequest,servletResponse);}else{//如果session的属性user不为空,则放⾏filterChain.doFilter(servletRequest,servletResponse);}}@Overridepublic void destroy() {}}2.3 HelloServlet程序package com.filter.filter;import java.io.*;import javax.servlet.http.*;import javax.servlet.annotation.*;@WebServlet(name = "helloServlet", value = "/hello-servlet")public class HelloServlet extends HttpServlet {private String message;public void init() {message = "Hello World!";}public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {response.setContentType("text/html");// HelloPrintWriter out = response.getWriter();out.println("<html><body>");out.println("<h1>" + message + "</h1>");out.println("</body></html>");HttpSession session = request.getSession();session.setAttribute("user","ningqian");}public void destroy() {}}2.4 web.xml<?xml version="1.0" encoding="UTF-8"?><web-app xmlns="/xml/ns/javaee"xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/xml/ns/javaee /xml/ns/javaee/web-app_4_0.xsd"version="4.0"><filter><filter-name>FilterServlet</filter-name><filter-class>com.filter.filter.FilterServlet</filter-class></filter><filter-mapping><filter-name>FilterServlet</filter-name><!--表⽰受限的⽂件--><url-pattern>/admin/*</url-pattern></filter-mapping><servlet><servlet-name>HelloServlet</servlet-name><servlet-class>com.filter.filter.HelloServlet</servlet-class></servlet><servlet-mapping><servlet-name>HelloServlet</servlet-name><url-pattern>/hello</url-pattern></servlet-mapping></web-app>2.5 index.jsp<?xml version="1.0" encoding="UTF-8"?><web-app xmlns="/xml/ns/javaee"xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/xml/ns/javaee /xml/ns/javaee/web-app_4_0.xsd"version="4.0"><filter><filter-name>FilterServlet</filter-name><filter-class>com.filter.filter.FilterServlet</filter-class></filter><filter-mapping><filter-name>FilterServlet</filter-name><!--表⽰受限的⽂件--><url-pattern>/admin/*</url-pattern></filter-mapping><servlet><servlet-name>HelloServlet</servlet-name><servlet-class>com.filter.filter.HelloServlet</servlet-class></servlet><servlet-mapping><servlet-name>HelloServlet</servlet-name><url-pattern>/hello</url-pattern></servlet-mapping></web-app>三、测试1.启动服务器2.在浏览器地址栏输⼊:http:localhost:8080/filter/admin/1.jpg表⽰直接访问admin⽬录下的图⽚由于此⽬录下的⽂件在web.xml中配置为受限,所以此时请求被FilterServlet收到,使⽤doFilter⽅法进⾏请求过滤检查,发现会话session中没有user属性,所以将该请求转发到index.jsp3.在浏览器地址栏输⼊:http:localhost:8080/filter/⾸页不在受限的⽬录下,所以可以直接访问,点击页⾯上的链接Hello Servlet,此时,将请求发到服务器,HelloServlet程序接收,通过doGet()⽅法,给会话session的user赋值4.再次在浏览器输⼊:http:localhost:8080/filter/admin/1.jpg,此时就可以正常访问。
java filter用法
Java Filter用法1. 概述Java中的Filter是一种被用于过滤请求和响应的组件。
它可以在请求到达目标资源之前对请求进行预处理,也可以在响应返回给客户端之前对响应进行后处理。
Filter通常被用于实现一些通用的、与业务逻辑无关的功能,如日志记录、权限控制、字符编码转换等。
2. Filter接口在Java中,Filter是一个接口,定义了三个方法:public interface Filter {void init(FilterConfig filterConfig) throws ServletException;void doFilter(ServletRequest request, ServletResponse response, FilterChai n chain) throws IOException, ServletException;void destroy();}•init(FilterConfig filterConfig):在Filter被初始化时调用,可以读取配置信息或者做一些初始化工作。
•doFilter(ServletRequest request, ServletResponse response, FilterChain chain):实际的过滤逻辑需要在这个方法中实现。
在该方法中,可以对请求和响应进行处理,并将处理后的请求和响应传递给下一个Filter或Servlet。
•destroy():在Filter被销毁时调用,可以释放资源或清理工作。
3. 使用Filter要使用Filter,需要按照以下步骤进行配置和编写代码:3.1 配置web.xml首先,在web.xml文件中配置Filter的映射关系。
例如:<filter><filter-name>myFilter</filter-name><filter-class>com.example.MyFilter</filter-class><init-param><param-name>param1</param-name><param-value>value1</param-value></init-param></filter><filter-mapping><filter-name>myFilter</filter-name><url-pattern>/path/*</url-pattern></filter-mapping>上述配置中,我们定义了一个名为myFilter的Filter,并将其映射到了以/path/开头的URL路径上。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
day15过滤器(Filter)过滤器概述1什么是过滤器过滤器JavaWeb三大组件之一,它与Servlet很相似!不它过滤器是用来拦截请求的,而不是处理请求的。
当用户请求某个Servlet时,会先执行部署在这个请求上的Filter,如果Filter“放行”,那么会继承执行用户请求的Servlet;如果Filter不“放行”,那么就不会执行用户请求的Servlet。
其实可以这样理解,当用户请求某个Servlet时,Tomcat会去执行注册在这个请求上的Filter,然后是否“放行”由Filter来决定。
可以理解为,Filter来决定是否调用Servlet!当执行完成Servlet 的代码后,还会执行Filter后面的代码。
2过滤器之hello world其实过滤器与Servlet很相似,我们回忆一下如果写的第一个Servlet应用!写一个类,实现Servlet应该没有问题吧,都可以看懂吧!OK了,现在可以尝试去访问index.jsp页面了,看看是什么效果!当用户访问index.jsp页面时,会执行HelloFilter的doFilter()方法!在我们的示例中,index.jsp 页面是不会被执行的,如果想执行index.jsp页面,那么我们需要放行!有很多同学总是错误的认为,一个请求在给客户端输出之后就算是结束了,这是不对的!其实很多事情都需要在给客户端响应之后才能完成!过滤器详细1过滤器的生命周期我们已经学习过Servlet的生命周期,那么Filter的生命周期也就没有什么难度了!●init(FilterConfig):在服务器启动时会创建Filter实例,并且每个类型的Filter只创建一个实例,从此不再创建!在创建完Filter实例后,会马上调用init()方法完成初始化工作,这个方法只会被执行一次;●doFilter(ServletRequest req,ServletResponse res,FilterChain chain):这个方法会在用户每次访问“目标资源(<url->pattern>index.jsp</url-pattern>)”时执行,如果需要“放行”,那么需要调用FilterChain的doFilter(ServletRequest,ServletResponse)方法,如果不调用FilterChain 的doFilter()方法,那么目标资源将无法执行;●destroy():服务器会在创建Filter对象之后,把Filter放到缓存中一直使用,通常不会销毁它。
一般会在服务器关闭时销毁Filter对象,在销毁Filter对象之前,服务器会调用Filter 对象的destory()方法。
2FilterConfig你已经看到了吧,Filter接口中的init()方法的参数类型为FilterConfig类型。
它的功能与ServletConfig相似,与web.xml文件中的配置信息对应。
下面是FilterConfig的功能介绍:●ServletContext getServletContext():获取ServletContext的方法;●String getFilterName():获取Filter的配置名称;与<filter-name>元素对应;●String getInitParameter(String name):获取Filter的初始化配置,与<init-param>元素对应;●Enumeration getInitParameterNames():获取所有初始化参数的名称。
3FilterChaindoFilter()方法的参数中有一个类型为FilterChain的参数,它只有一个方法:doFilter(ServletRequest,ServletResponse)。
前面我们说doFilter()方法的放行,让请求流访问目标资源!但这么说不严密,其实调用该方法的意思是,“我(当前Filter)”放行了,但不代表其他人(其他过滤器)也放行。
也就是说,一个目标资源上,可能部署了多个过滤器,就好比在你去北京的路上有多个打劫的匪人(过滤器),而其中第一伙匪人放行了,但不代表第二伙匪人也放行了,所以调用FilterChain类的doFilter()方法表示的是执行下一个过滤器的doFilter()方法,或者是执行目标资源!如果当前过滤器是最后一个过滤器,那么调用chain.doFilter()方法表示执行目标资源,而不是最后一个过滤器,那么chain.doFilter()表示执行下一个过滤器的doFilter()方法。
4多个过滤器执行顺序5四种拦截方式我们来做个测试,写一个过滤器,指定过滤的资源为b.jsp,然后我们在浏览器中直接访问b.jsp,你会发现过滤器执行了!但是,当我们在a.jsp中request.getRequestDispathcer(“/b.jsp”).forward(request,response)时,就不会再执行过滤器了!也就是说,默认情况下,只能直接访问目标资源才会执行过滤器,而forward 执行目标资源,不会执行过滤器!http://localhost:8080/filtertest/b.jsp -->直接访问b.jsp时,会执行过滤器内容;http://localhost:8080/filtertest/a.jsp -->访问a.jsp,但a.jsp会forward到b.jsp,这时就不会执行过滤器!其实过滤器有四种拦截方式!分别是:REQUEST、FORWARD、INCLUDE、ERROR。
●REQUEST:直接访问目标资源时执行过滤器。
包括:在地址栏中直接访问、表单提交、超链接、重定向,只要在地址栏中可以看到目标资源的路径,就是REQUEST;●FORWARD:转发访问执行过滤器。
包括RequestDispatcher#forward()方法、<jsp:forward>标签都是转发访问;●INCLUDE:包含访问执行过滤器。
包括RequestDispatcher#include()方法、<jsp:include>标签都是包含访问;●ERROR:当目标资源在web.xml中配置为<error-page>中时,并且真的出现了异常,转发到目标资源时,会执行过滤器。
可以在<filter-mapping>中添加0~n个<dispatcher>子元素,来说明当前访问的拦截方式。
其实最为常用的就是REQUEST和FORWARD两种拦截方式,而INCLUDE和ERROR都比较少用!其中INCLUDE比较好理解,我们这里不再给出代码,学员可以通过FORWARD方式修改,来自己测6过滤器的应用场景过滤器的应用场景:●执行目标资源之前做预处理工作,例如设置编码,这种试通常都会放行,只是在目标资源执行之前做一些准备工作;●通过条件判断是否放行,例如校验当前用户是否已经登录,或者用户IP是否已经被禁用;●在目标资源执行后,做一些后续的特殊处理工作,例如把目标资源输出的数据进行处理;7设置目标资源这一特性与Servlet完全相同!通过这一特性,我们可以在用户访问敏感资源时,执行过滤器,例如:<url-pattern>/admin/*<url-pattern>,可以把所有管理员才能访问的资源放到/admin路径下,这时可以通过过滤器来校验用户身份。
当用户访问http://localhost:8080/filtertest/abc时,会执行名字为myservlet的Servlet,这时会执行过滤器。
8Filter小结Filter的三个方法:●void init(FilterConfig):在Tomcat启动时被调用;●void destroy():在Tomcat关闭时被调用;●void doFilter(ServletRequest,ServletResponse,FilterChain):每次有请求时都调用该方法;FilterConfig类:与ServletConfig相似,用来获取Filter的初始化参数●ServletContext getServletContext():获取ServletContext的方法;●String getFilterName():获取Filter的配置名称;●String getInitParameter(String name):获取Filter的初始化配置,与<init-param>元素对应;●Enumeration getInitParameterNames():获取所有初始化参数的名称。
FilterChain类:●void doFilter(ServletRequest,ServletResponse):放行!表示执行下一个过滤器,或者执行目标资源。
可以在调用FilterChain的doFilter()方法的前后添加语句,在FilterChain的doFilter()方法之前的语句会在目标资源执行之前执行,在FilterChain的doFilter()方法之后的语句会在目标资源执行之后执行。
四各拦截方式:REQUEST、FORWARD、INCLUDE、ERROR,默认是REQUEST方式。
●REQUEST:拦截直接请求方式;●FORWARD:拦截请求转发方式;●INCLUDE:拦截请求包含方式;●ERROR:拦截错误转发方式。
过滤器应用案例分ip统计网站的访问次数1说明网站统计每个IP地址访问本网站的次数。
2分析因为一个网站可能有多个页面,无论哪个页面被访问,都要统计访问次数,所以使用过滤器最为方便。
因为需要分IP统计,所以可以在过滤器中创建一个Map,使用IP为key,访问次数为value。
当有用户访问时,获取请求的IP,如果IP在Map中存在,说明以前访问过,那么在访问次数上加1,即可;IP在Map中不存在,那么设置次数为1。
把这个Map存放到ServletContext中!3代码粗粒度权限控制(拦截是否登录、拦截用户名admin权限)1说明我们给出三个页面:index.jsp、user.jsp、admin.jsp。
●index.jsp:谁都可以访问,没有限制;●user.jsp:只有登录用户才能访问;●admin.jsp:只有管理员才能访问。
2分析设计User类:username、password、grade,其中grade表示用户等级,1表示普通用户,2表示管理员用户。
当用户登录成功后,把user保存到session中。