我正在使用spring MVC并且在jsessionid中遇到问题,我发现如果在浏览器中没有启用cookie,则会在URL中注入jsessionid,生成类似的URL:
HTTP://本地主机/类别; JSESSIONID = Bsls4aQFXA5RUDcmZKV5iw CID = 13001?
实际上浏览器没有问题,但是当Google抓取我的网站,并且Google抓取工具似乎没有Cookie :)时,他们会将该网站的网址存储在该表单中,而我的网站会显示在搜索结果中,其网址类似于包含jsessionid的网址.
实际上它运行没有任何问题,但我更喜欢在没有jsessionid的情况下将网址显示在Google搜索结果中.
有帮助吗?
我使用以下代码从我的系统注销用户.
/**
* This function helps to set the session attribute for the present user to null and then
* removes the attribute itself and this helps in clearing the session
* @param request
* @param response
*/
@RequestMapping(value = AuthConstants.EXIT, method = RequestMethod.POST)
public void exitPrime(HttpServletRequest request, HttpServletResponse response) {
/*Getting session and then invalidating it*/
HttpSession session = request.getSession(false);
if(request.isRequestedSessionIdValid() && session != null)
{
session.invalidate();
}
}
Run Code Online (Sandbox Code Playgroud)
这导致成功注销,但登录时提供的JSESSION ID仍然保留在浏览器中,因为对于任何新用户,在登录时再次使用相同的JSESSION ID.我希望JSESSIONID cookie仅对当前会话有效,一旦用户注销,它将被销毁或无效以便下次完成登录.我的登录代码如下: -
/**
* This method allows …Run Code Online (Sandbox Code Playgroud) 我有一个使用welcome-page index.jsp的应用程序,<iframe></iframe>iframe的内容是一个jsf页面.如果我访问index.jsp,我会在第一次获取firebug时看到一个cookie:
Set-Cookie JSESSIONID=C615DA89B6EF73F801973EA3DCD3B226; Path=/
Run Code Online (Sandbox Code Playgroud)
<iframe>继承这个jsessionid 的页面.但是:当我直接访问我的页面时,<iframe/>我在第一次请求时将jsessionId重写为所有没有cookie的URL.之后使用cookie.这一切都很好 - 如果:安全系统允许我执行URL重写.
我运行jboss 4.2.2
我希望实现与index.jsp相同的行为 - 例如,总是使用cookie并始终避免http重写.
[编辑] 感谢balusc的回答我写道:
public class JsessionIdAvoiderFilter implements Filter {
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException,
ServletException {
boolean allowFilterChain = redirectToAvoidJsessionId((HttpServletRequest) req, (HttpServletResponse)res);
//I'm doing this because if I execute the request completely, it will perform a pretty heavy lookup operation. No need to do it twice.
if(allowFilterChain)
chain.doFilter(req, res);
}
public static boolean redirectToAvoidJsessionId(HttpServletRequest req, HttpServletResponse res) …Run Code Online (Sandbox Code Playgroud) 我正在尝试在JSESSIONID cookie上设置httponly标志.我在Java EE 5中工作,但是无法使用setHttpOnly().首先,我尝试doPost()使用在servlet中创建自己的JSESSIONID cookie response.setHeader().
如果那不起作用,我试过了response.addHeader().那也行不通.然后,我了解到servlet处理将会话转换为JSESSIONID cookie并将其插入http头中,因此如果我想使用该cookie,我将不得不编写一个过滤器.我写了一个过滤器和setHeader()/ addHeader()在那里玩,再次无济于事.
然后,我了解到响应对象在进入过滤器之前会有一些刷新/关闭动作,所以如果我想操纵数据,我需要扩展HttpServletResponseWrapper并传递给它filterChain.doFilter().这已经完成,但我仍然没有得到结果.显然我做错了但我不知道是什么.
我不确定这与手头的问题是否完全相关,但servlet没有将任何html文档返回给浏览器.所有真正发生的事情是正在填充一些对象并将其返回到JSP文档.我有点假设Session对象被转换为JSESSIONID cookie,并在发送到浏览器之前将其与添加到请求中的对象一起包装在http标头中.
我很乐意发布一些代码,但我想排除我的困难源于对该理论的误解的可能性.
我正在测试一个Rest API使用SOAP UI工具.
首先,我点击了另一个API,它给了我jSessionid,然后在我的实际请求中,我通过名称"Cookie"向请求头添加了一个参数,并为其提供了上面提取的jsessionid值.一切都很好.
我想要的是以某种方式动态设置请求标头中的cookie/jessionid而不显式/手动执行它.
怎么做到呢?
有谁知道Tomcat 6和Tomcat 7之间的配置发生了哪些变化会导致JSESSIONIDcookie无法通过JavaScript访问?
使用Tomcat 6:
alert(document.cookie); // JSESSIONID=8675309ABCDEF...
Run Code Online (Sandbox Code Playgroud)
使用Tomcat 7:
alert(document.cookie); // nothing
Run Code Online (Sandbox Code Playgroud) 我目前正在开展一个项目,我们希望用户通过Facebook和其他OAuth2提供商登录.此外,REST api应该是无状态的.因此,不应创建/使用cookie/jsessionids.对于api的授权,在通过Facebook成功登录后,api会发布JWT.消耗其余api的webapp是使用AgularJS和satellizer构建的.我将代码缩减为github上的最小示例.
工作流程理念:
到目前为止工作
问题
webapp和其他api的"login/facebook?code = XXX"调用的组合不起作用.我发现当你进行GET"login/facebook"时,你将被重定向到facebook,并在网址上附加一个额外的状态参数.此外,当facebook重定向回api时,还会添加此状态参数.从我在网上找到的,这似乎是一种CSRF保护,对吧?我猜这个东西也创造了jsessionid cookie?
问题
示例代码
如前所述,我在GitHub上放了一个完整的最小例子.在这里,我将只发布WebSecurityConfigurerAdapter(希望)最重要的部分.该完整的文件在这里.
@EnableOAuth2Client
@Configuration
public class OAuth2ClientConfigurer extends WebSecurityConfigurerAdapter {
@Autowired
private OAuth2ClientContext oAuth2ClientContext;
@Override
protected void configure(HttpSecurity httpSecurity) throws Exception {
httpSecurity
.csrf().disable()
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).enableSessionUrlRewriting(false).and()
.antMatcher("/**").authorizeRequests()
.antMatchers("/login/**").permitAll()
.anyRequest().authenticated().and()
.exceptionHandling().authenticationEntryPoint(new Http403ForbiddenEntryPoint()).and()
.addFilterBefore(statelessJwtAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class)
.addFilterBefore(createSsoFilter(facebook(), facebookSuccessHandler(), "/login/facebook"), BasicAuthenticationFilter.class);
}
private OAuth2ClientAuthenticationProcessingFilter createSsoFilter(ClientResourceDetails clientDetails, AuthenticationSuccessHandler successHandler, String path) { …Run Code Online (Sandbox Code Playgroud) 我注意到,当用户第一次访问我的网站时,Wicket生成的URL包含一个jsessionid,而不是依赖于cookie来获取会话信息.
cookie确实成功设置,如果用户只是重新加载页面,jsessionid则不再附加到URL.你可以在这里测试一下:pixlshare.com.将鼠标悬停在任何图片链接上都会显示带有jsessionid; 重新加载页面,jsessionids将被删除.
根据以前的Wicket SEO页面的经验,我知道如何删除jsessionid它以将其隐藏起来,但是对于普通用户使用这种技术似乎是一种黑客攻击.它也将破坏网站,让那些偏执狂的人足以让cookie被禁用.
这是在最近从Glassfish转移到Tomcat之后发生的,尽管我不能肯定地说这是原因.另外,我在Tomcat面前使用Apache的mod_proxy.
由于某些安全原因,我决定jsessionid在URL中禁用会话跟踪.在我将web.xml更改为下面的文件之前,我第一次访问jsessionid网址中的页面时,在点击第一个链接后,它再也没有出现过.
我的web.xml样子
<session-config>
<session-timeout>10</session-timeout>
<cookie-config>
<secure>true</secure>
</cookie-config>
<tracking-mode>COOKIE</tracking-mode>
</session-config>
Run Code Online (Sandbox Code Playgroud)
现在我有了jsessionidURL,如果我点击页面上的另一个链接,它永远不会消失.每次点击都会改变.
如果我尝试调用JSF操作,我得到一个javax.faces.application.ViewExpiredException但托管bean是@SessionScoped.
这是我的依赖树:
[INFO] Scanning for projects...
[INFO] Searching repository for plugin with prefix: 'dependency'.
[INFO] ------------------------------------------------------------------------
[INFO] Building Java EE 6 webapp project
[INFO] task-segment: [dependency:tree]
[INFO] ------------------------------------------------------------------------
[INFO] [dependency:tree {execution: default-cli}]
[INFO] de.project:demoapp:war:1.0-SNAPSHOT
[INFO] +- javax.enterprise:cdi-api:jar:1.0-SP4:provided
[INFO] | +- org.jboss.spec.javax.interceptor:jboss-interceptors-api_1.1_spec:jar:1.0.0.Final:provided (version managed from 1.0.0.Beta1)
[INFO] | \- javax.inject:javax.inject:jar:1:provided
[INFO] +- org.jboss.spec.javax.annotation:jboss-annotations-api_1.1_spec:jar:1.0.0.Final:provided
[INFO] +- org.jboss.spec.javax.ws.rs:jboss-jaxrs-api_1.1_spec:jar:1.0.0.Final:provided
[INFO] +- org.hibernate.javax.persistence:hibernate-jpa-2.0-api:jar:1.0.1.Final:provided …Run Code Online (Sandbox Code Playgroud) 我在本地运行Weblogic 10.3,并对它生成的sessionId有疑问.当我打印session.getId()时,我看到类似于此的东西:
BBp9TAACMTglQ2TDFAKR4tpyXg73LZDQJ2PtT9x8htG1tWY122aa!869187422!1308677666322
这些惊叹号及其后面是什么,特别是第二对:!1308677666322?看起来有时服务器会附加它,有时却不会.我相信如果我使用相同的浏览器第二次登录我的应用程序,weblogic会附加它.这个cookie是否以某种方式相关?