过滤器Filter(重点)
Filter过滤器:用来过滤网站的数据;
1:Filter开发过程;
1:导包;(Servlet下的包)
2:编写过滤器
实现Filter接口,重写对应的方法即可
public class CharacterEncodingFilter implements Filter {
//初始化: web服务器启动,就已经初始化了,随时等待过滤器对象的出现!
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("CharacterEncodingFilter初始化");
}
//Chain: 链
/*
1: 过滤中的所有代码,在过滤特定请求的时候都会执行;
2:必须要让过滤前继续执行。
filterChain.doFilter(servletRequest,servletResponse);
*/
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
servletRequest.setCharacterEncoding("utf-8");
servletResponse.setCharacterEncoding("utf-8");
servletResponse.setContentType("text/html;charset=utf-8");
System.out.println("CharacterEncodingFilter执行前");
filterChain.doFilter(servletRequest,servletResponse);
System.out.println("CharacterEncodingFilter执行后");
}
//销毁 : web服务器关闭的时候,会销毁;
@Override
public void destroy() {
System.out.println("CharacterEncodingFilter销毁");
}
}
3:在web.xml 中配置Filter
这里我们要过滤哪个包下的程序,就写哪个包。
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>com.kuang.filter.CharacterEncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<!--只要是 /servlet 的任何请求,会经过这个过滤器-->
<url-pattern>/servlet/*</url-pattern>
</filter-mapping>
4:创建一个Servlet包,过滤字符集的字符集编码问题。
public class ShowServlt extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().write("你好啊,世界!");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
5: 配置web.xml 文件;
<servlet>
<servlet-name>ShowServlt</servlet-name>
<servlet-class>com.kuang.servlet.ShowServlt</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ShowServlt</servlet-name>
<url-pattern>/servlet/show</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>ShowServlt</servlet-name>
<url-pattern>/show</url-pattern>
</servlet-mapping>
小结:当我们启动Tomcat,运行测试结果,请求 /show 时会发现字符集乱码,
请求 /servlet/show 时字符集不乱码。这时就能表明,程序被过滤了。servlet下的包都会被 fliter过滤
过滤器的Demo
需求:
用户登录之后进入页面。用户注销之后,就不能进入页面了。
思路:
1:用户登录之后,向session中存放数据。
2:进入主页之后,要判断用户是否已经登录成功。要求在过滤器中实现。
- 输入用户名,要么登录成功,要么登录失败
- 登录,要求用过滤器实现。
- 登录成功之后,向Session中存放数据。用途是:注销的时候移除Session。
- 跳转到登录成功页面。
- 当点击注销的时候,要求用过滤器判断session,并跳转到首页
- 登录失败,返回错误页面。重新登录等。
实现过程:
1:创建一个登陆的页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>登录页面</h1>
<form action="/servlet/login" method="post">
<input type="text" name="username">
<input type="submit">
</form>
</body>
</html>
当我们点击按钮,提交页面的时候,页面跳转到 /servlet/login 下
2:创建一个LoginServlet的类,并配置web.xml文件
创建一个LoginServlet类
public class LoginServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取前端请求的参数
String username = req.getParameter("username");
if(username.equals("admin")){
//登录成功
req.getSession().setAttribute("USER_SESSION",req.getSession().getId());
resp.sendRedirect("/sys/success.jsp");
}else {
//登录失败
resp.sendRedirect("/error.jsp");
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
登录不成功的页面
在web下创建
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>错误</h1>
<h3>没有权限,或者用户名错误!</h3>
<a href="/login.jsp">返回登录页</a>
</body>
</html>
配置web.xml。文件
<servlet>
<servlet-name>LoginServlet</servlet-name>
<servlet-class>com.kuang.servlet.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>LoginServlet</servlet-name>
<url-pattern>/servlet/login</url-pattern>
</servlet-mapping>
测试结果:
登录,要求用过滤器实现。
只需要将过滤的类放入指定的过滤器的地方就可以了。
配置过滤器:
public class CharacterEncodingFilter implements Filter {
//初始化: web服务器启动,就已经初始化了,随时等待过滤器对象的出现!
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("CharacterEncodingFilter初始化");
}
//Chain: 链
/*
1: 过滤中的所有代码,在过滤特定请求的时候都会执行;
2:必须要让过滤前继续执行。
filterChain.doFilter(servletRequest,servletResponse);
*/
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
servletRequest.setCharacterEncoding("utf-8");
servletResponse.setCharacterEncoding("utf-8");
servletResponse.setContentType("text/html;charset=utf-8");
System.out.println("CharacterEncodingFilter执行前");
filterChain.doFilter(servletRequest,servletResponse);
System.out.println("CharacterEncodingFilter执行后");
}
//销毁 : web服务器关闭的时候,会销毁;
@Override
public void destroy() {
System.out.println("CharacterEncodingFilter销毁");
}
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>com.kuang.filter.CharacterEncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<!--只要是 /servlet 的任何请求,会经过这个过滤器-->
<url-pattern>/servlet/*</url-pattern>
</filter-mapping>
这里说明:servlet中的类,都会被过滤器过滤。比如我们的字符集编码过滤,注销后的session过滤实现。
3:注销实现
登录页面后,添加一个注销的实现。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--<%--%>
<%--Object attribute = request.getSession().getAttribute("USER_SESSION");--%>
<%--if (attribute == null){--%>
<%--response.sendRedirect("/login.jsp");--%>
<%--}--%>
<%--%>--%>
<h1>主页,登录成功!</h1>
<p><a href="/servlet/logout">注销</a></p>
</body>
</html>
编写一个注销的类,配置web.xml文件
public class LoginServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取前端请求的参数
String username = req.getParameter("username");
if(username.equals("admin")){
//登录成功
req.getSession().setAttribute("USER_SESSION",req.getSession().getId());
resp.sendRedirect("/sys/success.jsp");
}else {
//登录失败
resp.sendRedirect("/error.jsp");
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
配置web.xml
<servlet>
<servlet-name>LoginoutServlet</servlet-name>
<servlet-class>com.kuang.servlet.LoginoutServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>LoginoutServlet</servlet-name>
<url-pattern>/servlet/logout</url-pattern>
</servlet-mapping>
filter过滤注销 的实现(session)
public class SysFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;
Object user_session = request.getSession().getAttribute("USER_SESSION");
if (user_session == null){
response.sendRedirect("/error.jsp");
}
filterChain.doFilter(request,response);
}
@Override
public void destroy() {
}
<filter>
<filter-name>SysFilter</filter-name>
<filter-class>com.kuang.filter.SysFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>SysFilter</filter-name>
<url-pattern>/sys/*</url-pattern>
</filter-mapping>
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/71895.html