在做B/S开发的时候,安全性是必须要考虑的问题。其中有一个问题就是url的访问控制,具体来说就是你不经过登录页面登录那么你就不能访问后面的管理页面,或者是会员进去之后才能看到的页面。 以前用C#开发ASP.NET项目的时候是在每一个页面后台代码的page_load事件中对session进行判断,if语句实现如果没有相应的session值就会跳转到login页面或者index页面。如果仅有十几个页面也就罢了,但是如果后台页面几百个呢?总不能每一个页面都写一个吧。那么在学习javaweb开发的时候有了一个很好的解决方案,那就是通过filter来解决。 这个Filter就像是web系统的一道防火墙,你要访问任何资源,都会经过它的许可才行。所以这个“防火墙”里面的规则设定尤其重要,其中一个就是对url的访问控制。 实现的基本原理就是:在实现Filter接口的类中判断当前访问的url,如果不是登录页面,那么就判断session是否为null,判断session里面指定的参数是否为null。这样就可以了。
实现代码: 建立一个SessionFilter.java类来实现javax.servlet.Filter接口:
.. code:: java
package com.util;
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;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class SessionFilter implements Filter {
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest)request;
HttpServletResponse res = (HttpServletResponse)response;
HttpSession session = req.getSession();
System.out.println(req.getRequestURI());//测试uri
System.out.println(req.getRequestURL());//测试url
String requestUri = req.getRequestURI().substring(req.getRequestURI().indexOf("/",1),req.getRequestURI().length());
//如果不是登录页面
if (!"/login.jsp".equalsIgnoreCase(requestUri)) {
//如果没有登录
if (session == null || session.getAttribute("user_info") == null) {
res.sendRedirect(req.getContextPath() + "/login.jsp");
return;
}
}
//继续访问其他资源
chain.doFilter(req, res);
}
@Override
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
}
}
配置web.xml中的filter标签,是的每一个资源访问都会通过刚才建立的这个filter:
::
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:javaee="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<filter>
<filter-name>SessionFilter</filter-name>
<filter-class>com.util.SessionFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>SessionFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>SessionFilter</filter-name>
<url-pattern>/servlet/*</url-pattern>
</filter-mapping>
</web-app>
建立两个页面login.jsp和admin.jsp: login.jsp:
::
<%@ page language="java" contentType="text/html; charset=GB18030"
pageEncoding="GB18030"%>
<%@ page import="com.domain.*" %>
<%
request.setCharacterEncoding("GB18030");
String command = request.getParameter("command");
Admin admin = new Admin();
if ("login".equalsIgnoreCase(command)) {
//下面这一句用来解决乱码
String name=new String(request.getParameter("user_name").getBytes("ISO-8859-1"),"GB2312");
out.println(name);
admin.setUserName(request.getParameter("user_name").toString());
session.setAttribute("user_info",name);
response.sendRedirect("admin.jsp");
}
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GB18030">
<title>Insert title here</title>
</head>
<form action="login.jsp">
<input type="hidden" name="command" value="login">
输入用户名:<input type="text" name="user_name">
<input type="submit" value="登录">
</form>
<body>
</body>
</html>
admin.jsp:
::
<%@ page language="java" contentType="text/html; charset=GB18030"
pageEncoding="GB18030"%>
<%@ page import="com.domain.*" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GB18030">
<title>Insert title here</title>
</head>
这里是管理面板,当前登录用户为:<%=(String)session.getAttribute("user_info") %>
<body>
</body>
</html>
最后说一下要注意其中session中的中文乱码问题。
—EOF—
- from the5fire.com微信公众号:Python程序员杂谈