一、Filter 过滤器
用于过滤网站的数据
1、处理编码问题
2、登录验证
等
Filter 步骤
1、导包
<!--servlet依赖-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
2、实现Filter,重写方法
注意! 必须实现 servlet下的Filter
public class CharacterEncordingFilter implements Filter {
/*初始化 Web服务器打开即进行初始化 等待过滤*/
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("过滤器初始化");
}
//chain : 链
/*
* 1、过滤方法中的代码,在过滤特定请求(web.xml下fileter-mapping的url-pattern)的时候都会执行
* 2、必须要让过滤器继续放行*/
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("过滤器执行");
//放行过滤器
//让代码继续走,如果不写,程序进行到这里就停止!!
//将request和response转发下去
filterChain.doFilter(servletRequest,servletResponse);
System.out.println("过滤器执行后");
}
/*销毁 web服务器关闭的时候 会进行销毁*/
public void destroy() {
System.out.println("过滤器销毁");
}
}
3、web.xml下配置映射
<filter>
<filter-name>charencding</filter-name>
<filter-class>com.mily.filter.CharacterEncordingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>charencding</filter-name>
<!--只要是/servlet/ 下的servlet 都进行这个过滤处理-->
<url-pattern>/servlet/*</url-pattern>
</filter-mapping>
测试
原先servlet下编码处理方式
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
/*原先处理乱码方法*/
//resp.setCharacterEncoding("utf-8");
resp.getWriter().write("中文中文 会乱码");
}
web.xml
<servlet>
<servlet-name>showservlet</servlet-name>
<servlet-class>com.mily.servlet.showservlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>showservlet</servlet-name>
<url-pattern>/servlet/show</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>showservlet</servlet-name>
<url-pattern>/show</url-pattern>
</servlet-mapping>
1、启动web服务器
2、访问 /show 乱码
3、访问 /servlet/show 编码解决,调用过滤方法
二、Listener 监听器
/*统计网站在线人数: 统计session*/
public class CountOnline implements HttpSessionListener {
/*创建session监听: 监听你的一举一动
* 一但创建了session就会触发*/
public void sessionCreated(HttpSessionEvent se) {
//获取到session 所有人都要访问到 作用域最高 需要获取ServletContext
ServletContext servletContext = se.getSession().getServletContext();
//获取存放的数据
Integer online = (Integer) servletContext.getAttribute("online");
//判断获取到的数据是否为空
//若为空 则无人在线 就创建一个
if (online==null){
online =new Integer(1);
}
else {//否则 就++
online+=new Integer(1);
}
servletContext.setAttribute("online",online);
}
//销毁session监听 一但销毁了session就会触发
public void sessionDestroyed(HttpSessionEvent se) {
/*销毁session
* 手动
* se.getSession().invalidate();
* 自动
* webxml下 设置过期时间*/
}
}
jsp 获取参数数据
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
<h1>
当前在线人数:
<%=this.getServletConfig().getServletContext().getAttribute("online") %>
</h1>
</body>
</html>
三、Filter实现权限拦截
login.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>登录页面</title>
</head>
<body>
<form action="/servlet/login" method="post">
<input type="text" name="username">
<input type="submit">
</form>
</body>
</html>
success.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>登录后界面</title>
</head>
<body>
<h1>主页</h1>
<p><a href="/servlet/loginout">注销</a></p>
</body>
</html>
登录servlet
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")){
System.out.println("登录成功");
//将登录信息存放起来
req.getSession().setAttribute("uname_session",req.getSession().getId());
resp.sendRedirect("/sys/success.jsp");
}
else {
System.out.println("登录失败");
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
注销servlet
public class LoginOutServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Object uname = req.getSession().getAttribute("uname_session");
if (uname!=null){
req.getSession().removeAttribute("uname_session");
resp.sendRedirect("/login.jsp");
}else {
resp.sendRedirect("/login.jsp");
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
权限过滤器
/*
* 加个过滤器
* 没有登录,不允许跳转到别的页面*/
public class jspFilter implements Filter {
public void init(FilterConfig filterConfig) throws ServletException {
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
//将ServletRequest 转为 HttpServletRequest 拿session
HttpServletRequest hreq =(HttpServletRequest) req;
HttpServletResponse hresq =(HttpServletResponse) resp;
Object uname_session = hreq.getSession().getAttribute("uname_session");
if (uname_session==null){
System.out.println("还没有登录,请先登录");
hresq.sendRedirect("/login.jsp");
}
chain.doFilter(req,resp);
}
public void destroy() {
}
}
web.xml
<servlet>
<servlet-name>login</servlet-name>
<servlet-class>com.mily.servlet.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>login</servlet-name>
<url-pattern>/servlet/login</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>loginout</servlet-name>
<servlet-class>com.mily.servlet.LoginOutServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>loginout</servlet-name>
<url-pattern>/servlet/loginout</url-pattern>
</servlet-mapping>
<filter>
<filter-name>filterlogin</filter-name>
<filter-class>com.mily.filter.jspFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>filterlogin</filter-name>
<url-pattern>/sys/*</url-pattern>
</filter-mapping>