不考虑框架下,在JAVA中使用session
大概有以下几种使用方法:
1、前台设置:利用jsp的内置对象session进行设置。
<%
sessionsetAttribute("username", username);
%>
2、后台设置:
(1)Filter设置:
public class MyFilter implements Filter {
@Override
public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain chain) throws IOException, ServletException {
//把请求和响应对象强制转换为>
扩展资料:
Session:在计算机中,尤其是在网络应用中,称为“会话控制”。Session
对象存储特定用户会话所需的属性及配置信息。
这样,当用户在应用程序的 Web 页之间跳转时,存储在 Session
对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。
当用户请求来自应用程序的 Web 页时,如果该用户还没有会话,则 Web
服务器将自动创建一个 Session 对象。当会话过期或被放弃后,服务器将终止该会话。
Session
对象最常见的一个用法就是存储用户的首选项。例如,如果用户指明不喜欢查看图形,就可以将该信息存储在 Session 对象中。
有关使用
Session 对象的详细信息,请参阅“ASP 应用程序”部分的“管理会话”。注意 会话状态仅在支持 cookie 的浏览器中保留。
session的工作原理:
1、当一个session第一次被启用时,一个唯一的标识被存储于本地的cookie中。
2、首先使用session_start()函数,PHP从session仓库中加载已经存储的session变量。
3、当执行PHP脚本时,通过使用session_register()函数注册session变量。
4、当PHP脚本执行结束时,未被销毁的session变量会被自动保存在本地一定路径下的session库中,这个路径可以通过phpini文件中的sessionsave_path指定,下次浏览网页时可以加载使用。
参考资料:
1、比如我在大多数时候可能使用 Filter 因为这种是最通用的 比如做一个底层的用户包 需要部署N台 可能有的用struts2
有的用spring 那么我就用Filter 还有必须在某些拦截器之前执行的 可以用这个
也就是在没有很好的用Interceptor的理由的情况下 用Filter
2、如果你的拦截器只在本项目中使用 且需要注入资源等 可以用拦截器
还有一种比较细节的场景 如你要在Filter中获取parameter 但此次处理是文件上传 如果不自己去转换Request则是得不到参数的 此时可以考虑用拦截器(因为进入拦截器时已经把request转了 可以拿参数了)
如果需要在Filter注入东西 但就想用Filter 可以使用orgspringframeworkwebfilterDelegatingFilterProxy
<filter>
<filter-name>syncOnlineSessionFilter</filter-name>
<filter-class>orgspringframeworkwebfilterDelegatingFilterProxy</filter-class>
<init-param>
<param-name>targetFilterLifecycle</param-name>
<param-value>true</param-value>
</init-param>
</filter>
它会自动到spring容器中找syncOnlineSessionFilter(Filter类型)的bean 使用
你是指你的 web 项目中使用到一个工具性的类,它的形参中没有 >
如果是这样的话,我们需要使用一个 ThreadLocal 变量,我们把当前 request 的变量绑定到里面,在一个 request 请求的生命周期内我们在方法调用的各个更深的层次中都可以直接使用它而不需要在每个方法中都传递这个 request 参数,保存在某个地方就容易导致因为多个请求共用同一个实例而出问题,所有 context 相关的变量不保存在任何业务类相关并且可能被多线程共用的对象实例中才是保证不会出现线程安全问题的途径。
例如,这个例子中我们只要把 webxml 中配置好 ContextFilter 后它就会自动在请求开始时绑定一个 context,结束后自动销毁,在这中间的任何时刻我们都可以通过 MyWebContextgetCurrentContext() 得到我们的 >// MyWebContext 记录当前 Request 的所有 context 变量。因为 servlet 是一个请求绑定一个线程的,我们用 ThreadLocal 不会有线程安全问题。
class MyWebContext {
private static final ThreadLocal contexts = new ThreadLocal();
// 拿出当前线程绑定的 context
public static MyWebContext getCurrentContext() {
return (MyWebContext) contextsget();
}
public static MyWebContext createContext() {
return new MyWebContext();
}
// 绑定一个 context 到当前线程
public static void setContext(MyWebContext context) {
contextsset(context);
}
public static void clearContext() {
contextsset(null);
}
private >
使用过滤器过滤请求,如果已经登录,则通过,没有登录或者超时则跳转到首页或者登录页面。
1,首先要写一个登录过滤器,public class SessionFilter implements Filter。一定要实现Filter,在doFilter方法中写出判断Session的代码。
2,配置webxml。
<filter><filter-name>SessionFilter</filter-name>
<filter-class>comtestfilterSessionFilter</filter-class>
</filter>
3,但是光有这些还是不够,这样它会拦截你所有的请求,包括你的登录请求,你在发起登录请求的时候就被拦截验证,是否已经登录,发现没有登录,然后给返回到首页了。所有要给过滤器设置“白名单”,哪些请求直接通过,不用过滤。
<init-param><param-name>noFilterURI</param-name>
<param-value>
/logindo
/indexjsp
</param-value>
</init-param>
4,在SessionFilter类中获取“白名单”,可以通过public void init(FilterConfig filterConfig)方法获取
public void init(FilterConfig filterConfig)throws ServletException
{
thisfilterConfig = filterConfig;
noFilterURI = filterConfiggetInitParameter("noFilterURI");
}
在doFilter方法中得到“白名单”,设置不用过滤,直接通过。
代码:
public class SessionFilter implements Filter{private FilterConfig filterConfig;
private String noFilterURI;
public SessionFilter() {
filterConfig = null;
noFilterURI = null;
}
public void init(FilterConfig filterConfig) throws ServletException{
thisfilterConfig = filterConfig;
noFilterURI = filterConfiggetInitParameter("noFilterURI");
}
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
throws IOException, ServletException{
// do something
}
public void destroy()
{
filterConfig = null;
}
}<filter>
<filter-name>SessionFilter</filter-name>
<filter-class>comtestfilterSessionFilter</filter-class>
<init-param>
<param-name>noFilterURI</param-name>
<param-value>
/logindo
/indexjsp
</param-value>
</init-param>
</filter>
我们可以看到这个框架图,我们的整个交互都是与security Manager做交互,而这里面就有一个Session Manager的管理器,Shiro当然内置了实现,我们也可以根据接口拓展其功能,那么下面,我们就来了解一下shiro中关于Session管理的部分内容
这是一个管理器实现类,是shiro提供的可用的结构。
上面两个图是该SessionManager的方法,当然,这些方法并不是全部,因为这个默认的管理器其实继承于其他的一些结构,下面是整个sessionManager的UML图
有关这部分的源码分析,我会在下次有精力的时候用一篇文章更新
获取当前subject的主机地址,该地址是通过HostAuthenticationTokengetHost()提供的。
获取/设置当前Session的过期时间;如果不设置是默认的会话管理器的全局过期时间。
获取会话的启动时间和最后访问时间;如果是JavaSE应用需要自己定期调用sessiontouch()去更新最后访问时间;如果是web应用,每次进入ShiroFilter都会自动调用sessiontouch()来更新最后访问时间。
更新会话最后访问时间及销毁会话;当Subjectlogout()时会自动调用stop方法来销毁会话的。如果在web中,调用javaxservlet>
2)目录匹配
3)后缀名匹配
一、Filter简介
Filter 过滤器它是 JavaWeb 的三大组件之一。三大组件分别是:Servlet 程序、Listener 监听器、Filter 过滤器
Filter 过滤器它是 JavaEE 的规范。也就是接口
Filter 过滤器它的作用是:拦截请求,过滤响应。
拦截请求常见的应用场景有:
权限检查
日记 *** 作
事务管理
二、Filter使用
1、Filter 的初体验
要求:在你的 web 工程下,有一个 admin 目录。这个 admin 目录下的所有资源(html 页面、jpg 、jsp 文件、等等)都必须是用户登录之后才允许访问。
思考:根据之前我们学过内容。我们知道,用户登录之后都会把用户登录的信息保存到 Session 域中。所以要检查用户是否登录,可以判断 Session 中否包含有用户登录的信息即可。
Filter 的代码
public class AdminFilter implements Filter {
/
doFilter 方法,专门用于拦截请求。可以做权限检查
/
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,FilterChain filterChain) throws IOException, ServletException {
>
实现Filter接口的doFilter(ServletRequest servletRequest,ServletResponse servletResponse, FilterChain chain)方法
>
以上就是关于JAVA中怎么使用session全部的内容,包括:JAVA中怎么使用session、什么时候用filter,什么时候用interceptor、如何在Java的普通类中获取Session以及request对象等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)