用户免登录以及拦截器

拦截器在做项目中应用十分广泛,掌握好拦截器会让你事半功倍。接下来展示下我的在登录中用到的拦截器。
具体操作是:正常情况下:当进入登录页面,输入正确的用户名与密码后跳转到登录成功界面。在session中设置自动销毁时间并登录成功后,可以在相应的时间内免除登录。
不正常情况下:有的用户直接访问登录成功的界面,很显然,这是不可以的。所以访问登录成功页面后就会进入拦截器,如果拦截到你没有登录,会跳转到登录界面。
登录界面

<form action="userServlet">
    用户名:<input type="text" name = "name"/>
    密码:<input type="password" name = "password"/>
    <input type="submit"/>
</form>

登录成功后的界面是logok.jsp
在web.xml界面配置拦截器

 <filter>
    <filter-name>UserFilter</filter-name>
    <filter-class>com.zr.filter.UserFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>UserFilter</filter-name>
    <url-pattern>/logok.jsp</url-pattern>
  </filter-mapping>

为了简单起见,dao中与service中的接口我就不写了,直接写实现类

工具类

public class DBUtil {
    private static Connection conn =null;
    public static Connection getConnection(){
        //有些操作在执行完之后关闭了连接对象,那么虽然对象不为空,但是被关闭的连接对象不可用了
        try {
            //如果connection对象为null或者当前这个资源已经被关闭,那么就重新创建一个连接
            if(conn==null||conn.isClosed()){
                try {
                    //1-加载驱动
                    Class.forName("oracle.jdbc.driver.OracleDriver");
                    //2-创建连接
                    conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe"
                            , "SCOTT", "TIGER");
                } catch (ClassNotFoundException | SQLException e) {
                    e.printStackTrace();
                }
            }
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
        return conn;
    }
    
    
    /**
    public static void close(Connection conn,Statement statement,ResultSet rSet){
        try {
            if(conn!=null){
                conn.close();
            }
            if(statement!=null){
                statement.close();
            }
            if(rSet!=null){
                rSet.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    
    /**
     * 封装的是对表数据操作的所有方法
     * Object...args可变参数,代表可以有1个或者多个以上的参数
     * @return
     */
    public static boolean update(String sql,Object...args){
        Connection connection = getConnection();
        PreparedStatement pStatement = null;
        int rowcount = 0;
        try {
            pStatement = connection.prepareStatement(sql);
            for(int i=0;i<args.length;i++){
                //预编译sql语句中每一个?占位符赋值
                pStatement.setObject(i+1, args[i]);
            }
            //insert into emp values();
            rowcount = pStatement.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            close(connection, pStatement, null);
        }
        return rowcount==0?false:true;
    }

}

dao层实现类

@Override
    public User findByName(String uname) {
        User user=null;
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        List<User> list = new ArrayList<User>();
        try {
            conn = DBUtil.getConnection();
            String sql = "select * from user_table where name = ?";
            ps = conn.prepareStatement(sql);
            ps.setString(1, uname);
            rs = ps.executeQuery();
            while(rs.next()){
                String name = rs.getString(1);
                String password = rs.getString(2);
                user =  new User(name, password);
            }
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return user;
    }

service层实现类

public class UserServiceImpl implements UserService{

    @Override
    public User findByName(String uname) {
        UserDao dao = new UserDaoImpl();
        return dao.findByName(uname);
    }

}

servlet类

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        String name = request.getParameter("name");
        String password = request.getParameter("password");
        
        UserService service = new UserServiceImpl();
        User user = service.findByName(name);
        
        HttpSession session = request.getSession();
        if(user == null){
            //用户名不存在
            response.sendRedirect("login.jsp");
        }else{
            if(!password.equals(user.getPassword())){
                response.sendRedirect("login.jsp");
            }else{
                session.setAttribute("name", user.getName());
                session.setMaxInactiveInterval(2);
                response.sendRedirect("logok.jsp");
            }
        }

拦截器类

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        System.out.println("filter.......");
        HttpServletRequest req = (HttpServletRequest)request;
        String name = (String) req.getSession().getAttribute("name");
        System.out.println(name);
        if(name!=null){
            request.getRequestDispatcher("logok.jsp").forward(request, response);
        }else{
            request.getRequestDispatcher("login.jsp").forward(request, response);
        }
        chain.doFilter(request, response);
    }

实体类

public class User {

    private String name;
    private String password;
    public User() {
        super();
        // TODO Auto-generated constructor stub
    }
    public User(String name, String password) {
        super();
        this.name = name;
        this.password = password;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    @Override
    public String toString() {
        return "User [name=" + name + ", password=" + password + "]";
    }   
}

完整的项目代码已经上传到github中了,其中包括上面说到的要导入的包,访问地址:github

1.JPG
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容