一、过滤器filter
1、编写字符编码过滤器
编写一个实现servlet接口的程序
public class ServletShow extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().print("你好,世界!");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
可以发现在网页打印出来的为乱码
1、用过滤器进行编码设置,使得打印出来的为正常中文
public class FilterDemo implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("filter 已经初始化了");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
chain.doFilter(request,response);
}
@Override
public void destroy() {
System.out.println("filter 已经销毁了");
}
此处要注意导包不能错,为javax.servlet 下
通过运行可以得出以下结论:
1、初始化:web服务器启动,就以及初始化了,随时等待过滤对象出现!
2、过滤中的所有代码,在过滤特定请求的时候都会执行, 必须要让过滤器继续同行chain.doFilter(request,response);
3、销毁:web服务器关闭的时候,过滤会销毁
2、在web.xml中配置 Filter
<servlet>
<servlet-name>show</servlet-name>
<servlet-class>com.zhoudan.ServletShow</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>show</servlet-name>
<url-pattern>/show</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>show</servlet-name>
<url-pattern>/sys/show</url-pattern>
</servlet-mapping>
<filter>
<filter-name>filter</filter-name>
<filter-class>com.zhoudan.FilterDemo</filter-class>
</filter>
<filter-mapping>
<filter-name>filter</filter-name>
<url-pattern>/sys/*</url-pattern>
</filter-mapping>
只要是 /servlet的任何请求,会经过这个过滤器
2、实现权限拦截的过滤器
用户登录之后才能进入主页!用户注销后就不能进入主页了!
用户登录之后,向Sesison中放入用户的数据
进入主页的时候要判断用户是否已经登录;要求:在过滤器中实现!
登录页面为: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" ><br>
<input type="submit" value="登录" >
</form>
</body>
</html>
登录成功的页面:主页 /可以实现注销
success.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>登录成功</title>
</head>
<body>
<h1>主页</h1>
<a href="/servlet/layout">注销</a>
</body>
</html>
登录失败的页面:error.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>错误</title>
</head>
<body>
<h1>用户名错误,或者没有权限!</h1>
</body>
</html>
当登录成功之后,页面要跳转到首页,要实现用户数据的保存,就要编写以下servlet
LoginDemo:
public class LoginDemo extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获得参数
String userName = req.getParameter("username");
//放进session中
req.getSession().setAttribute("username",userName);
//进行判断
if(userName.equals("admin")){
resp.sendRedirect("/sys/success.jsp");
}else {
resp.sendRedirect("/error.jsp");
}
}
在web.xml中注册的servlet路径为登录成功后,跳转的路径
<servlet>
<servlet-name>login</servlet-name>
<servlet-class>com.zhoudan.LoginDemo</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>login</servlet-name>
<url-pattern>/servlet/login</url-pattern>
</servlet-mapping>
登录成功之后还要实现注销功能:将用户数据进行移除,并返回首页。
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//注销就把用户进行移除
HttpSession session = req.getSession();
Object userName =session.getAttribute("username");
if(userName!=null){
session.removeAttribute("username");
resp.sendRedirect("/login.jsp");
}else {
resp.sendRedirect("/login.jsp");
}
}
在web.xml中注册的servlet路径
<servlet>
<servlet-name>layout</servlet-name>
<servlet-class>com.zhoudan.LayoutDemo</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>layout</servlet-name>
<url-pattern>/servlet/layout</url-pattern>
</servlet-mapping>
但是,通过运行,可以发现注销之后,直接登录成功页面是可以实现的,就没有达到权限拦截的效果,所以引入滤波器进行权限的拦截
public class FilterDemo2 implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
//过滤器实现权限拦截 如果得到的session用户为null,就直接进入错误,不可以进登录成功的页面
chain.doFilter(request,response);
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse resp= (HttpServletResponse) response;
HttpSession session = req.getSession();
if(session.getAttribute("username")==null){
resp.sendRedirect("/error.jsp");
}
}
@Override
public void destroy() {
}
}
<!--注册过滤器-->
<filter>
<filter-name>filter2</filter-name>
<filter-class>com.zhoudan.filter.FilterDemo2</filter-class>
</filter>
<filter-mapping>
<filter-name>filter2</filter-name>
<url-pattern>/sys/*</url-pattern>
</filter-mapping>
运行结果如下:
登录的页面为:
主页为:
错误页面为:
注销之后,便不能直接进入主页,会进入错误页面!!
二、监听器
1、编写一个监听器,实现监听器的接口
//统计在线人数 一个session对应一个在线人数
public class ListenerDemo implements HttpSessionListener {
@Override
public void sessionCreated(HttpSessionEvent se) {
ServletContext ctx = se.getSession().getServletContext();
System.out.println(se.getSession().getId());
Integer onlineCount = (Integer) ctx.getAttribute("OnlineCount");
if (onlineCount == null) {
onlineCount = new Integer(1);
} else {
int count = onlineCount.intValue();
onlineCount = new Integer(count + 1);
}
ctx.setAttribute("OnlineCount", onlineCount);
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
ServletContext ctx = se.getSession().getServletContext();
Integer onlineCount = (Integer) ctx.getAttribute("OnlineCount");
if (onlineCount == null) {
onlineCount = new Integer(0);
} else {
int count = onlineCount.intValue();
onlineCount = new Integer(count - 1);
}
ctx.setAttribute("OnlineCount", onlineCount);
}
}
此程序做到了两点:
1、创建session监听: 看你的一举一动,一旦创建Session就会触发一次这个事件!
2、销毁session监听:一旦销毁Session就会触发一次这个事件!
2、web.xml中注册监听器
<listener>
<listener-class>com.zhoudan.ListenerDemo</listener-class>
</listener>