小编St.*_*rio的帖子

如何从 Spring Security 中删除过滤器?

其中Spring Security 4.0有所谓的Default Login Page,如下所示:

在此输入图像描述

深入研究源代码,我发现了 Filter org.springframework.security.web.authentication.ui.DefaultLoginPageGenerateFilter

它呈现该登录页面。实际上,它有 private String generateLoginPageHtml(HttpServletRequest request, boolean loginError, boolean logoutSuccess)方法,其中包含以下代码片段:

if (formLoginEnabled) {
    sb.append("<h3>Login with Username and Password</h3>");
    sb.append("<form name='f' action='").append(request.getContextPath()).append(authenticationUrl).append("' method='POST'>\n");
    sb.append(" <table>\n");
    sb.append("    <tr><td>User:</td><td><input type='text' name='");
    sb.append(usernameParameter).append("' value='").append("'></td></tr>\n");
    sb.append("    <tr><td>Password:</td><td><input type='password' name='").append(passwordParameter).append("'/></td></tr>\n");

    if (rememberMeParameter != null) {
        sb.append("    <tr><td><input type='checkbox' name='").append(rememberMeParameter).append("'/></td><td>Remember me on this computer.</td></tr>\n");
    }

    sb.append("    <tr><td colspan='2'><input name=\"submit\" type=\"submit\" value=\"Login\"/></td></tr>\n");
    renderHiddenInputs(sb, request);
    sb.append("  </table>\n");
    sb.append("</form>");
}
Run Code Online (Sandbox Code Playgroud)

问题是我想从过滤器链中删除该过滤器,以便自定义由 url 定位的登录页面http://my-domain/login。是否可以?

我的安全配置:

<http auto-config="true"> …
Run Code Online (Sandbox Code Playgroud)

java spring spring-security

3
推荐指数
1
解决办法
6059
查看次数

无法将fom枚举转换为它实现的接口

我在Java 7,我有以下枚举:

public enum BooleanEnum implements StringRepresentable{
    YES {
        @Override
        public String getStringRepresentation() {
            return "true";
        }
    },
    NO {
        @Override
        public String getStringRepresentation() {
            return "false";
        }
    };
    public abstract String getStringRepresentation();
}
Run Code Online (Sandbox Code Playgroud)

现在我有了方法:

List<StringRepresentable> getValues(){
    return Arrays.asList(BooleanEnum.values()); //Type mismatch: 
                  //cannot convert from List<BooleanEnum> to List<StringRepresentable>
}
Run Code Online (Sandbox Code Playgroud)

这有什么问题enum?它实现了接口,因此代码应该编译得很好.

java enums

3
推荐指数
1
解决办法
1126
查看次数

Servlet 上下文和 Spring 应用程序上下文的本质区别

我正在阅读 spring 框架文档,现在我在应用程序范围概念。关于这个概念的文档是这样说的:

这有点类似于 Spring 单例 bean,但在两个重要方面有所不同: 它是每个 ServletContext 的单例,而不是每个 Spring ApplicationContext

对我来说,不清楚的是我们如何想象 Spring 应用程序上下文和 Servlet 上下文之间的关系。

我假设它们之间的关系有两种可能的情况:

一世

在此处输入图片说明

在此处输入图片说明

那么,Spring 应用程序上下文与 Servlet 上下文是如何关联的呢?是情况I还是情况II或两者都不是?

java spring servlets

3
推荐指数
1
解决办法
2227
查看次数

将两个catch clasuses组合在一起

我有以下代码:

try {
    //do some
} catch (NumberFormatException e) {
    return DynamicFilterErrorCode.INVALID_VALUE;
} catch (ClassCastException e) {
    return DynamicFilterErrorCode.INVALID_VALUE;
} catch (IllegaleArgumentException e) {
    return DynamicFilterErrorCode.INVALID_VALUE;
}
Run Code Online (Sandbox Code Playgroud)

是否可以将这3个catch子句合并为一个?它们具有完全相同的处理程序代码,因此我想重用它.

java exception

3
推荐指数
1
解决办法
3441
查看次数

使用HashMap,HashSet等时覆盖hashCode?

问题出在标题中.我使用HashMap如下:

Map<Player, Partner> m = new HashMap<Player, Partner>();
//do some on m
Run Code Online (Sandbox Code Playgroud)

如果双方PlayerPartner只是一个POJO代表数据模型.

public class Player{

    private int id;

    private String name;
    //etc, GET, SET
}

public class Partner{

    private int id;

    private String name;
    //etc, GET, SET
}
Run Code Online (Sandbox Code Playgroud)

我想说这些类的两个对象是相同的,如果它们具有相同的id.所以,我应该hashCode写点什么

public int hashCode(){
    return id;
}
Run Code Online (Sandbox Code Playgroud)

这是一种正确的方法吗?为什么我要在使用HashMap或类似的东西时使用它?

java hashcode

3
推荐指数
1
解决办法
465
查看次数

C++按值返回对象

这个话题几乎就是问题的标题.我在Meyrses的书"Effective C++"中看到了这个:

C++按值返回对象的事实

这意味着什么以及C++标准如何支持该消息?对于实例,请说我们有这样的事情:

int foo()
{
    int a = 1;
    return a;
}
Run Code Online (Sandbox Code Playgroud)

这很清楚,这个短语意味着我们返回存储在局部变量中的值的副本.但考虑一下:

int& foo()
{
    int a = 1;
    return a;
}
Run Code Online (Sandbox Code Playgroud)

编译器应警告我们返回对局部变量的引用.那个"按价值回归的事实"如何适用于这个例子?

c++ return function

3
推荐指数
1
解决办法
103
查看次数

两次捕获相同的异常

我有以下内容:

public void method(){

    try {
        methodThrowingIllegalArgumentException();
        return;
    } catch (IllegalArgumentException e) {
        anotherMethodThrowingIllegalArgumentException();            
        return;
    } catch (IllegalArgumentException eee){ //1
       //do some
       return;
    } catch (SomeAnotherException ee) {
       return;
    }
}
Run Code Online (Sandbox Code Playgroud)

Java不允许我们两次捕获异常,因此我们得到了compile-rime错误//1.但我需要完成我尝试做的事情:

首先尝试该methodThrowingIllegalArgumentException()方法,如果失败IAE,尝试anotherMethodThrowingIllegalArgumentException();,如果失败IAE,请做一些并返回.如果失败而SomeAnotherException只返回.

我怎样才能做到这一点?

java exception try-catch

3
推荐指数
1
解决办法
2972
查看次数

了解UnsupportedOperationException

我不太明白我可以在哪里抛出这个异常.

例如,我正在实现Future<T>接口,并且不希望任何人调用该方法:

未来#get(long,TimeUnit).

那么,我可以扔掉UnsupportedOperationException吗?

public T get(long timeout, TimeUnit unit){
    throw new UnsupportedOperationException();
}
Run Code Online (Sandbox Code Playgroud)

事情是该方法的规范没有说什么关于抛出异常.反过来,例外

抛出以指示不支持所请求的操作.

Class UnsupportedOperationException

我的意思是,如果您不希望它被调用或者它可能被认为是不正确的,因为并非所有方法都已实现,它是否常见?在我的具体情况下,我认为调用该方法没有意义......

java interface exception

3
推荐指数
2
解决办法
5561
查看次数

了解concurrentModificationException和ArrayList的实现

我试着通过编写以下代码来重现ConcurrentModificationException:

List<String> last = new ArrayList<>();
last.add("a");
last.add("b");
for(String i : last){
    System.out.println(i);
    last.remove(i);
}
System.out.println(last);
Run Code Online (Sandbox Code Playgroud)

DEMO

既然,提到文件ArrayList

请注意,迭代器的故障快速行为无法得到保证,因为一般来说,在存在不同步的并发修改时,不可能做出任何硬性保证.

我预计在单线程程序中,这种检测是直截了当的.但程序打印出来了

a
[b]
Run Code Online (Sandbox Code Playgroud)

代替.为什么?

java iterator arraylist

3
推荐指数
2
解决办法
1735
查看次数

并发迭代和线程安全

我正在阅读B. Goetz Java Concurrency In Practice,现在我正处于关于线程安全集合的部分.他描述了可能抛出的所谓"隐藏的迭代器" ConcurrentModificationException.以下是他发布的例子:

public class HiddenIterator{

    @GuardedBy("this")
    private final Set<Integer> set = new HashSet<Integer>();

    public synchronized void add(Integer i){ set.add(i); }
    public synchronized void remove(Integer i){ set.remove(i); }

    public void addTenThings(){
        Random r = new Random();
        for(int i = 0; i < 10; i++)
            add(r.nextInt());
        System.out.println("DEBUG: added ten elements to set " + set)
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,显然addTenThings()可能ConcurrentModificationException因为打印set的内容涉及迭代而抛出.但他提出以下建议来处理它:

如果HiddenIterator使用synchronizedSet包装HashSet,封装同步,则不会发生此类错误.

我不太明白.即使我们包装set成同步包装器,该类仍将保留NotThreadSafe.他的意思是什么?

java multithreading

3
推荐指数
1
解决办法
96
查看次数